这是一个奇怪的问题.我有一个客户端对象,我正在使用Crockford-esque公共/私人成员建立:
var client = function() { var that,remote_data,other_data; // add public interface that.doStuff = function(){...} // wait for remote resources to load remote_data = jsonRequest1(); other_data = jsonRequest2(); return that; };
我遇到的问题是我需要加载一些远程JSON资源,然后再返回新的“该”对象(这就是一个可以准备的客户端).数据异步返回(显然),我设置布尔变量来指示每个远程资源何时返回.
我想过要做如下的事情:
return whenInitialized(function() { return that; });
whenInitialized函数返回是否两个布尔标志都为真.我会使用setInterval的组合,但我相信这将无法正常工作.
感谢您的建议.
解决方法
为了在异步操作成功后运行代码,需要一个延续.当操作完成时,它可以只是一个代码调用的回调.
这样的东西
var client = function(done) { // done is the callback var that,other_data; // add public interface that.doStuff = function(){...} // wait for remote resources to load var done1 = false,done2 = false; var complete1 = function() { done1 = true; if (done2) done(); }; var complete2 = function() { done2 = true; if (done1) done(); }; remote_data = jsonRequest1(complete1); other_data = jsonRequest2(complete2); return that; };
但是这些控制标志真的很烦人,并没有真正的规模.一个更好的说明性的方式是使用像jQuery deferreds这样的东西:
$.when(jsonRequest1(),jsonRequest2()).then(done);