【问题标题】:Javascript promise fail to catch timeouts or 500 server errorJavascript 承诺无法捕获超时或 500 服务器错误
【发布时间】:2018-09-26 03:16:54
【问题描述】:

我正在尝试使用 javascript Promise 多次调用函数。该函数实际上调用了一个 URL 并取回 json 对象。调用成功后,我会正确取回 json 对象。如果任何调用失败,例如超时或 500 错误,则 catch 不会记录。我尝试调试代码,发现它从未被捕获。

var promises = [];
for (var i = 0; i < questionIds.length; i++) {          
    promises.push(createPromise());         
}
Promise.all(promises).then(function (res) {
    console.log(success);
}).catch( function (error) {
    console.log("error out");
    console.log(error);
});

function createPromise() {
    return new Promise(function(resolve, reject) { 
    getserviceresult();
});
}

【问题讨论】:

  • 你没有兑现你的承诺。 getserviceresult() 返回什么?
  • 你既没有调用函数resolve也没有调用reject
  • 如果getserviceresult() 返回承诺,那么只需promises.push(getserviceresult());。或写promises = questionIds.map(getserviceresult); 将您的每个questionIds 传递给getserviceresult()

标签: javascript promise


【解决方案1】:

你必须这样做:

function createPromise() {
    return new Promise(function(resolve, reject) { 
    getserviceresult().then(function (result) {
      if(result){
        resolve(result)
      }else{
        reject('some error')
      }
    });
});

或一些围绕您的函数并调用 resolve and reject 的逻辑。

function createPromise() {
    return new Promise(function(resolve, reject) { 
    const result = getserviceresult();
    if(result){
      resolve(result)
    }else{
      reject('some error')
    }
});

【讨论】:

  • 我在控制台中看到“错误输出”。但我添加了 3 个承诺,其中 2 个超时,一个是成功。我想为每一个失败的承诺登录控制台。
  • 我还在控制台中收到“无法读取未定义的属性 'then'”错误。
  • 一旦一个 Promise 被拒绝,链条就会中断。它不会继续。这就是为什么您只看到一个错误。如果您想单独查看每个错误,请不要将它们链接起来。在 Promise.all 中被拒绝的任何 Promise 都将使用 catch 方法。它不会继续。引用 MDN “拒绝:如果任何传入的 Promise 被拒绝,Promise.all 会以被拒绝的 Promise 的值异步拒绝,无论其他 Promise 是否已解决。”
  • 你能提供一些非链接的例子吗?
  • 类似createPromise().then(result =&gt; {}).catch(err =&gt; console.log(err))。每个 Promise 的结构都相同。
猜你喜欢
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2013-03-15
  • 2019-01-22
  • 2017-06-26
  • 2013-02-06
相关资源
最近更新 更多