我正在使用 JayData.js 库。它工作得很好。但是,在某些情况下,我在函数树的深处有一个 toArray() 调用。与其尝试从那里访问我的“忙碌”信号,不如尽快使用方法块。那可能吗?我正在描绘类似“context.Groups.toArray(myObservableVar).block()”的东西。
更新 1:从返回值上使用“then”和“when”运算符判断,JayData 库似乎返回了一个 jQuery 延迟对象。有没有相应的“加入”方法——意思是等待完成?
我正在使用 JayData.js 库。它工作得很好。但是,在某些情况下,我在函数树的深处有一个 toArray() 调用。与其尝试从那里访问我的“忙碌”信号,不如尽快使用方法块。那可能吗?我正在描绘类似“context.Groups.toArray(myObservableVar).block()”的东西。
更新 1:从返回值上使用“then”和“when”运算符判断,JayData 库似乎返回了一个 jQuery 延迟对象。有没有相应的“加入”方法——意思是等待完成?
事实上 JayData toArray() (以及所有相关的数据返回或保存/更新方法)实现了 jQuery deferred。从 1.0.5 开始,您必须包含 JayDataModules/deferred.js 才能使此功能正常工作。
对于您的用例$.when
可能是一个答案:
var customers = context.Customers.toArray();
var products = context.Products.toArray();
var suppliers = context.Suppliers.toArray();
$.when(customers, products, suppliers).then(function(customers, products, suppliers) {
//we have everything here
//notice the the parameter names are shadowed as the var customers variable only
//holds a promise not the value
customers.forEach( ... );
products[12].ProductName = "X";
});
一种blockUntilDone()
方法会违反延迟执行和继续的原则。JayDatatoArray()
是异步的,因为它旨在不阻止调用者。
如果你想要这种代码:
// Initialize context and groups...
var arrayOfGroups = context.Groups.toArray(); // Want synchronous behavior.
// Do something with 'arrayOfGroups'...
试图阻止直到延迟解决不是解决方案。将代码的最后一部分移到传递给的回调中toArray()
:
// Initialize context and groups...
context.Groups.toArray(function(arrayOfGroups) {
// Do something with 'arrayOfGroups'...
});
或者,使用done()或then()绑定到返回的承诺:
context.Groups.toArray().done(function(arrayOfGroups) {
// Do something with 'arrayOfGroups'...
});