【问题标题】:Does jQuery.when accept native Promise objects?jQuery.when 是否接受本机 Promise 对象?
【发布时间】:2018-12-29 18:11:38
【问题描述】:

我可以将native Promise object 传递给jQuery when 并让它按预期运行吗?

【问题讨论】:

  • 如果你有原生承诺,那么我们建议你使用Promise.all(),因为它通常更容易使用。
  • @jfriend00 正在集成使用 jquery deferreds / when 与较新的 ES6 代码库的旧代码库,因此我们需要同时使用两者。
  • @bigless 这个问题的措辞肯定是重复的,但我很难解析这个问题的答案。引用了许多“承诺”,并且非常不清楚他们在谈论什么版本的 Jquery 以及他们在谈论什么样的承诺。

标签: javascript jquery promise es6-promise jquery-deferred


【解决方案1】:

是的,确实如此。传递给then 的第一个参数是promise,从那里我们必须再次调用result.then() 才能得到promise 的结果。

$.when(new Promise(resolve => {
  setTimeout(() => resolve('abc123'), 2000)
})).then(result => result.then(data => console.log(data)))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

    【解决方案2】:

    是或否取决于使用的 jQuery 版本。

    1. jQuery $.when() 不会打开原生 js Promise。它对待除自己的 Deferreds/Promises 以外的任何事物的方式与对待任何其他对象/值的方式相同。

    // using jQuery 2.1.1
    $.when(Promise.resolve('xxxyyy')).then(result => {
        console.log(result);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    1. jQuery 3+ ...是的...在版本 3 中,jQuery 被修改为(至少在这方面)符合 Promise/A+ 规范。 $.when() 将解开任何与 Promise/A+ 兼容的 Promise/thenable,包括 js 原生 Promises。

    // using jQuery 3.1.1
    $.when(Promise.resolve('xxxyyy')).then(result => {
        console.log(result);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-18
      • 2015-03-01
      • 2018-05-20
      • 2011-01-23
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多