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

Posted

技术标签:

【中文标题】在 Dojo Deferred 解决之前如何阻止?【英文标题】:How can I block until Dojo Deferred is resolved? 【发布时间】:2012-09-27 17:43:50 【问题描述】:

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

【问题讨论】:

我不知道你的 deferred 做什么,但似乎你应该摆脱它。延迟用于非阻塞、异步行为。 【参考方案1】:

我从 dojo-interest 邮件列表中收到了 very helpful answer,所以我想我会把它贴在这里:

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

浏览器中的 javascript 是单线程的。如果你坐等 a Deferred to resolve,那么您正在使用该线程。这是一样的 下线某处需要的线程来服务调用 Deferred.resolve() (它本身会导致调用 您传递给 .then()) 的函数。

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

【讨论】:

以上是关于在 Dojo Deferred 解决之前如何阻止?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 dojo 滚动到所需的输入

无法保存到 Dojo 中的存储

Dojo 和模板解决方案

如何使用 jQuery 延迟?

在dojo内通过编程方式在网格中添加单选按钮

如何产生结果 Javascript 嵌套延迟