【问题标题】:Jquery $.when not waiting for promises to resolve, rejectJquery $.当不等待承诺解决时,拒绝
【发布时间】:2018-11-20 21:55:41
【问题描述】:

我有一个动态的 API 调用数组需要出去。但是,jQuery 的 $.when 似乎并没有等待承诺解决或被拒绝,或者我不明白如何正确使用承诺。

代码

function addEntry(data) {
  return new Promise(function(resolve, reject) {
    _customAPIClass_.post('some/url/path', data)
      .done(function(){
        console.log('resolving');
        resolve(1000)
      })
      .catch(function(){
        console.log('rejecting');
        reject(2000);
      })
  });
}

let deferreds = [];

$.each(form.find(el), function(i, element) {
  let data = {
    id: $(element).find('.id').val(),
    name: $(element).find('.name').val()
  }
  deferreds.push(addEntry(data));
}

if (deferreds.length) {
  $.when.apply(deferreds).then(function(data){
    console.log('All done', data)
  }, function(err){
    console.log('error', err);
  });
}

控制台输出 在 .then() 执行后,两个 api 调用拒绝了 Promise

所以,我不明白的是,Stack Overflow 或 jQuery 文档上的其他问题没有帮助我解决,为什么 .then() 在 API 调用完成之前表现得好像一切正​​常并解决或拒绝了他们的承诺?在进行所有 API 调用后,我如何处理解析或拒绝,还是我误解了 .when() 和承诺的目的?

【问题讨论】:

  • 您的.apply 似乎遗漏了一些非常重要的东西。 (需要两个参数)
  • 您使用 .apply 而不仅仅是直接调用 .when() 的任何特殊原因?有关使用示例,请参阅 api.jquery.com/jquery.when。另请注意,它仍然不会等待所有必要的事情完成 - 一旦任何承诺被拒绝,它就会触发回调。
  • @ADyson 因为 $.when 不接受数组。
  • 啊,对不起,我错过了。
  • 在这种情况下:Pass in an array of Deferreds to $.when()可能重复

标签: javascript jquery promise


【解决方案1】:

变化:

$.when.apply(延期)

到:

$.when.apply($, deferreds)

如此处所述:https://medium.com/sungthecoder/making-multiple-ajax-calls-and-deciphering-when-apply-array-b35d1b4b1f50 和 Kevin B 的评论中所述:

"当我们调用 $.when() 函数时,函数内部的 'this' 关键字隐式绑定到 jQuery 对象。但是当我们调用 $.when.apply() 时,我们必须显式绑定 'this' 关键字到一些东西。而且我们知道绑定必须与 jQuery 对象,所以我们传递 jQuery 对象,也就是 $ 作为第一个参数。”

【讨论】:

  • 感谢您的帮助。处理承诺总是让我绊倒,由于某种原因很难缠住我的头。
猜你喜欢
  • 1970-01-01
  • 2019-04-29
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多