【问题标题】:Resolve jquery deferred object with another deferred object用另一个延迟对象解析 jquery 延迟对象
【发布时间】:2015-05-07 22:13:57
【问题描述】:

如何用另一个的解析状态来解析一个延迟对象。 请简单的例子和​​简单的解释(看到很多困难的)。

如果没有.done(..).fail(..),我如何解决result 承诺与foo()

var result = $.Deferred();

/**
 * @returns {Deferred}
 */
var foo = function() {
  // ... something that returns deferred object at random moment of time
};

foo()
  .done(function(){result.resolve()})
  .fail(function(){result.reject()})
;

setTimeout(function() {
    result.reject();
}, 50);

setTimeout(function(){
    console.log('Result is:', result.state());
}, 100);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

【问题讨论】:

  • 这闻起来是the deferred anti-pattern
  • 它更复杂。 foo 函数不能被修改,result 可以通过许多其他方式解决。但是,如果foo 已首先解决,result 应该具有foo 的分辨率。

标签: javascript jquery promise jquery-deferred deferred


【解决方案1】:

您可以使用$.Deferred 中传递的函数并从内部解决/拒绝延迟:

var result = $.Deferred(function() {
    Math.random() > 0.5 ? this.resolve() : this.reject();
});

setTimeout(function(){
    document.write('Result is: ' + result.state());
}, 100);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

【讨论】:

  • 如果我们聪明点:var result = $.Deferred()[Math.random() > 0.5 ? "resolve" : "reject"]()
【解决方案2】:

您的 Deferred 对象 def 是多余的(请参阅 Benajmin Gruenbaum 给出的链接,为什么它实际上很危险 [沉默失败])。解析/拒绝结果对象:

var result = $.Deferred();
var foo = function() {
  return Math.random() > 0.5 ? result.resolve() : result.reject();
};

setTimeout(function(){
    document.write('Result is:', result.state());
}, 500);

foo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

【讨论】:

  • @BenjaminGruenbaum 感谢您阐明了我不关注的代码方面。答案已调整。
  • 解决在 foo 函数之外定义的 result deferred 实际上更糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多