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

Jer*_*Orr 6 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");
Run Code Online (Sandbox Code Playgroud)

显然Deferred.gimmeTheResultNow()不存在,但那是我正在寻找的功能.我没有控制调用getSomething()的代码,所以我不能让它处理一个Deferred; 它需要真正的结果.

我知道xhrGet()有一个同步参数,如果这是一个AJAX调用,我认为它会起作用,但情况不一定如此.有没有其他方法可以实现这一目标?

Jer*_*Orr 5

我从 dojo-interest 邮件列表中得到了一个非常有用的答案,所以我想我应该把它贴在这里:

不幸的是,您无法在浏览器中执行此操作。

浏览器中的 JavaScript 是单线程的。如果您正在等待 Deferred 解决,那么您正在使用该线程。这与后续某个地方需要的同一线程来服务对 Deferred.resolve() 的调用(该线程本身将导致对您传递给 .then() 的函数的调用)。

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