6

我知道 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 调用,我认为它可以完成这项工作,但情况并非如此。有没有其他方法可以做到这一点?

4

1 回答 1

4

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

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

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

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

于 2012-09-28T12:47:03.747 回答