当前位置: 首页 > 面试题库 >

处理Promise.all中的错误

常雅珺
2023-03-14
问题内容

我有一系列要解决的承诺 Promise.all(arrayOfPromises);

我继续继续诺言链。看起来像这样

existingPromiseChain = existingPromiseChain.then(function() {
  var arrayOfPromises = state.routes.map(function(route){
    return route.handler.promiseHandler();
  });
  return Promise.all(arrayOfPromises)
});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
  // do stuff with my array of resolved promises, eventually ending with a res.send();
});

我想添加一个catch语句来处理单个promise,以防万一出错,但是当我尝试时,Promise.all返回它发现的第一个错误(忽略其余的),然后我无法从其余的promise中获取数据数组(没有错误)。

我尝试做类似..

existingPromiseChain = existingPromiseChain.then(function() {
      var arrayOfPromises = state.routes.map(function(route){
        return route.handler.promiseHandler()
          .then(function(data) {
             return data;
          })
          .catch(function(err) {
             return err
          });
      });
      return Promise.all(arrayOfPromises)
    });

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
      // do stuff with my array of resolved promises, eventually ending with a res.send();
});

但这并不能解决。

谢谢!

-

编辑:

下面的答案完全正确,但代码由于其他原因而中断。如果有人感兴趣,这就是我最终得到的解决方案…

节点快速服务器

serverSidePromiseChain
    .then(function(AppRouter) {
        var arrayOfPromises = state.routes.map(function(route) {
            return route.async();
        });
        Promise.all(arrayOfPromises)
            .catch(function(err) {
                // log that I have an error, return the entire array;
                console.log('A promise failed to resolve', err);
                return arrayOfPromises;
            })
            .then(function(arrayOfPromises) {
                // full array of resolved promises;
            })
    };

API调用(route.async调用)

return async()
    .then(function(result) {
        // dispatch a success
        return result;
    })
    .catch(function(err) {
        // dispatch a failure and throw error
        throw err;
    });

.catch用于Promise.all在之前.then似乎已经担任了从原来的承诺捕捉任何错误,但随后整个数组返回到下一个目的.then

谢谢!


问题答案:

Promise.all是全有还是全无。一旦阵列中的所有承诺都解决,它就会解决,或者一旦 其中一个
拒绝,就立即拒绝。换句话说,它要么使用所有已解析值的数组进行解析,要么使用单个错误进行拒绝。

有些库中有一个叫做的东西Promise.when,据我所知,它会等待数组中的 所有 promise解析或拒绝,但是我并不熟悉它,而且它不在ES6中。

您的密码

我在这里同意其他人的观点,认为您的修复应该可以进行。它应使用可能包含成功值和错误对象混合的数组来解析。在成功路径中传递错误对象是不寻常的,但是假设您的代码期望它们,我认为它没有问题。

我能想到它“无法解决”的唯一原因是,它在代码中失败,您没有向我们显示;而您没有看到关于此的任何错误消息,是因为该诺言链没有以final结尾捕获(就您正在向我们展示的内容而言)。

我冒昧地从您的示例中排除了“现有链”,并以一条链来终止该链。这可能不适合您,但是对于阅读此书的人来说,始终返回或终止链很重要,否则潜在的错误(甚至编码错误)将被隐藏(这是我怀疑在这里发生的事情):

Promise.all(state.routes.map(function(route) {
  return route.handler.promiseHandler().catch(function(err) {
    return err;
  });
}))
.then(function(arrayOfValuesOrErrors) {
  // handling of my array containing values and/or errors. 
})
.catch(function(err) {
  console.log(err.message); // some coding error in handling happened
});


 类似资料:
  • 我可以看到promise没有实现,因为返回的数组包含适当的拒绝promise。 有人能告诉我为什么不调用吗?(如果我在中有一个promise数组,其中一个被拒绝,我就知道是这样)

  • 本文向大家介绍Promise.all中对于reject的处理方法,包括了Promise.all中对于reject的处理方法的使用技巧和注意事项,需要的朋友参考一下 昨天写了个小爬虫,用axios.all同时请求多个页面时,国内网络的原因很容易就超时然后reject了,佛系resolve不可取啊,然后想到可以实现一个“重发失败请求”的功能。 Promise.all(requestPromises).

  • 我对node.js比较熟悉,编写一个程序时需要承诺异步API调用。我有一个关于执行一些示例代码的问题,这是我在研究中偶然发现的。 下面的代码(根据我的理解)将访问一个API,等待响应,然后将该响应解析为承诺。这是迭代完成的,每个创建的承诺都被传递到一组承诺中。最终,对许诺数组调用promise.all()和.then(),将执行更多代码来迭代数组并将图像添加到页面中。 这里我不理解的是promis

  • 问题内容: 解析器不知道要做什么时的默认行为是将消息打印到终端,例如: 第1:23行在“}”处缺少DECIMAL 这是一个很好的信息,但是在错误的位置。我宁愿将此作为例外。 我尝试使用,但是会抛出一个没有消息的消息(由引起,也没有消息)。 有什么办法可以让我通过异常报告错误,同时又保留消息中的有用信息? 这就是我真正想要的—我通常在规则中使用动作来构建对象: 然后,当我调用解析器时,我将执行以下操

  • 问题内容: 有没有一种方法来处理错误,比如,你可以在使用块,等等? 我已经在网上搜索过,发现的唯一选择是global变量,但是它没有按我预期的那样工作,例如,以下代码: 确实会以某种方式回滚,因为我在table1上更改的名称保留了我在此处进行测试时的旧值,但是它不会打印消息,也不会执行我在导致错误的指令之后放置的任何指令 有人可以帮我吗?您知道Sybase错误处理是如何工作的吗? 问题答案: 第一

  • 问题内容: jQuery的getScript函数似乎不支持错误回调函数。我不能在这里使用全局ajax错误处理代码,局部错误功能将是理想的选择。 回调获取data / textStatus的文档似乎不正确-回调均不获取。 关于如何检测到对getScript的调用失败的任何建议(例如,服务器不可用)? 编辑:仅查看源代码,似乎回调仅在成功时才调用,数据始终设置为null且未定义textStatus(因