在Dojo Deferred解决之前,我该如何阻止?

时间:2012-09-27 17:43:50

标签: javascript dojo deferred

我知道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调用,我认为它会起作用,但情况不一定如此。有没有其他方法可以实现这个目标?

1 个答案:

答案 0 :(得分:4)

我从dojo-interest邮件列表中得到了very helpful answer,所以我想我会坚持下去:

  

很遗憾,您无法在浏览器中执行此操作。

     

浏览器中的JavaScript是单线程的。如果你坐着等待   a推迟解析,然后你正在使用该线程。这是一样的   线路将需要某个地方为服务呼叫   Deferred.resolve()(它本身会导致调用   你传递给.then())的函数。

     

您可以同步调用xhr,因为XHR的基本实现   get允许您同步调用它。 dojo / Deferred的功能   只是XHR内部的包装。