我知道Dojo Deferreds的推荐用例是使用dojo.when(def)或def.then(),并在解析Deferred时提供回调。但是,有时候我会遇到各种各样的情况,我真的需要等待延迟完成才能继续当前的线程。这是一个例子(http://jsfiddle.net/DG3Ax/2/的完整示例)
function getSomething() {
var def = getSomeDeferred();
def.then(function(result) {
dojo.place("<li>def.then() = " + result + "</li>", "output");
});
return def.gimmeTheResultNow();
}
dojo.place("<li>getSomething() = " + getSomething() + "</li>", "output");
显然Deferred.gimmeTheResultNow()
不存在,但那是我正在寻找的功能。我没有控制调用getSomething()的代码,所以我不能让它处理一个Deferred;它需要真正的结果。
我知道xhrGet()有一个同步参数,如果这是一个AJAX调用,我认为它会起作用,但情况不一定如此。有没有其他方法可以实现这个目标?
答案 0 :(得分:4)
我从dojo-interest邮件列表中得到了very helpful answer,所以我想我会坚持下去:
很遗憾,您无法在浏览器中执行此操作。
浏览器中的JavaScript是单线程的。如果你坐着等待 a推迟解析,然后你正在使用该线程。这是一样的 线路将需要某个地方为服务呼叫 Deferred.resolve()(它本身会导致调用 你传递给.then())的函数。
您可以同步调用xhr,因为XHR的基本实现 get允许您同步调用它。 dojo / Deferred的功能 只是XHR内部的包装。