【问题标题】:Uncaught in promise error but getting result from first call未陷入承诺错误,但从第一次调用中获得结果
【发布时间】:2018-05-03 06:46:03
【问题描述】:

我有两个 AJAX 调用,第二个依赖于第一个,所以我决定使用 Promise。我在控制台中不断收到 Uncaught (in promise) abc123 错误。请注意,abc123 是我期望从第一个 AJAX 调用中获得的 id。第二个 AJAX 调用永远不会进入成功函数。

var promise = new Promise(function(reject, resolve) {
  $.ajax({
    url: url1, 
    dataType: 'json',
    success: function (obj1) {
      console.log("Got obj1");
      resolve(obj1.id);
    }
  });
});

promise.then((id)=> {
  $.ajax({
    url: url2, 
    dataType: 'json',
    success: function (obj2) {
      console.log("Got obj2");
    }
  });
});

结构看起来与Basic Example 完全相同。我真的很困惑我做错了什么。

【问题讨论】:

    标签: javascript ajax asynchronous promise es6-promise


    【解决方案1】:

    你混淆了回调函数的顺序:resolve 是第一个参数,reject 是第二个参数,所以当你调用第二个 (resolve(obj.id)) 时,你实际上拒绝了你的承诺。

    但是,请注意you should not use the Promise constructor 无论如何dodging jQuery promises - 只需使用Promise.resolve$.ajax 返回到本地的jQuery 承诺:

    var promise = Promise.resolve($.ajax({
      url: url1, 
      dataType: 'json'
    })).then(obj1 => {
      console.log("Got obj1");
      return obj1.id;
    });
    
    promise.then(id => {
      return $.ajax({
    //^^^^^^ don't forget this
        url: url2, 
        dataType: 'json'
      });
    }).then(obj2 => {
      console.log("Got obj2");
    });
    

    【讨论】:

    • 躲避 jQuery 承诺是什么意思?如果这是在文档中完成的方式,为什么不遵循它?
    • @user8571142 $.ajax already returns a promise,但它是jQuery's own promise implementationis known to have its problems)的一个实例,而不是本机Promise。 MDN 文档从不在任何地方使用 jQuery - new Promise 适用于需要回调的异步函数,例如 setTimeout
    • @user8571142,如果您的代码在您希望从中返回承诺的函数中,那么您很可能需要return promise.then(...),而不是分配的中间变量promise
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 2021-12-26
    • 2021-02-18
    • 2019-04-19
    • 2016-01-24
    • 2017-02-17
    • 2020-01-21
    • 2021-01-09
    相关资源
    最近更新 更多