当前位置: 首页 > 知识库问答 >
问题:

等到所有promise完成,即使有些promise被拒绝

祝俊
2023-03-14

假设我有一组正在发出网络请求的promise,其中一个将失败:

// http://does-not-exist will throw a TypeError
var arr = [ fetch('index.html'), fetch('http://does-not-exist') ]

Promise.all(arr)
  .then(res => console.log('success', res))
  .catch(err => console.log('error', err)) // This is executed   

假设我想等到所有这些都完成了,不管有没有一个失败了。可能有一个网络错误的资源,我可以生存没有,但如果我可以获得,我想要在我继续。我想优雅地处理网络故障。

由于promises.all没有为此留出任何空间,那么在不使用promissions库的情况下,处理此问题的推荐模式是什么?

共有2个答案

夏骞尧
2023-03-14

类似的答案,但对于ES6来说可能更惯用:

null

const a = Promise.resolve(1);
const b = Promise.reject(new Error(2));
const c = Promise.resolve(3);

Promise.all([a, b, c].map(p => p.catch(e => e)))
  .then(results => console.log(results)) // 1,Error: 2,3
  .catch(e => console.log(e));


const console = { log: msg => div.innerHTML += msg + "<br>"};
<div id="div"></div>
宣煜
2023-03-14

更新时,您可能希望使用内置的本机promissione.allsettled:

Promise.allSettled([promise]).then(([result]) => {
   //reach here regardless
   // {status: "fulfilled", value: 33}
});

作为一个有趣事实,下面的回答是将方法添加到语言中的现有技术:]

当然,您只需要一个反射:

const reflect = p => p.then(v => ({v, status: "fulfilled" }),
                            e => ({e, status: "rejected" }));

reflect(promise).then((v => {
    console.log(v.status);
});

或使用ES5:

function reflect(promise){
    return promise.then(function(v){ return {v:v, status: "fulfilled" }},
                        function(e){ return {e:e, status: "rejected" }});
}


reflect(promise).then(function(v){
    console.log(v.status);
});

或者在您的示例中:

var arr = [ fetch('index.html'), fetch('http://does-not-exist') ]

Promise.all(arr.map(reflect)).then(function(results){
    var success = results.filter(x => x.status === "fulfilled");
});
 类似资料:
  • 问题内容: 假设我有一组正在发出网络请求的,其中一个会失败: 假设我要等到所有这些完成为止,无论是否失败。我无法使用的资源可能会出现网络错误,但是如果可以得到,我需要在继续之前进行此操作。我想优雅地处理网络故障。 既然没有任何余地,那么在不使用Promise库的情况下,推荐的处理方式是什么? 问题答案: 解决此问题的明确方法是简单地调用内部promise,然后从其回调中返回错误。 更进一步,您可以

  • 我正在做一个forEach循环,它对Cloudinary进行API调用,我正在用响应数据构建一个数组。 一旦收集到数据,我需要将其发送到其他API。 在发送数据之前,我如何等待promise得到解决并收集数据? 这是我的代码:

  • 我和Nodejs一起工作。我有一个异步,因为我必须等待内部的结果。因此,我需要等待foreach完成,然后继续循环的结果。我找到了几个等待的解决方案,其中一个是使用promise。虽然我这样做了,这些promise是创建的,但是,代码后的每个(因此promise)完成,从来没有实际执行(console.log没有打印)。NodeJS函数结束时没有任何错误。 这是我的密码: “here”只打印一次(

  • 所以我有一个情况,我有多个未知长度的promise链。我希望在处理完所有链后运行一些操作。这可能吗?这里有一个例子: 在本例中,我为promise一、promise二和promise三设置了一个,这些promise将在某个随机时间得到解决。然后,我在第一和第三段的末尾加上promise。我希望在解析所有链后解析。以下是我运行此代码时的输出: 有没有办法等待锁链解决?

  • 我有一个复杂的对象图,我建立在一个Ember控制器。 所以,为了安排这一切,我基本上是想 创建conatainer, 然后,创建细节,其中可能有许多 然后,创建项目,其中会有尽可能多的细节 等待一切promise解决 启动一个自定义的Rest动作来“激活”容器,一旦它有了所有的东西。 代码看起来像这样(咖啡),简化了但我认为要点就在那里 当所有的promise都解决了,一切都是我想要的,然而,al

  • 鉴于以下情况 只会包含第一个被拒绝的promise。有没有办法抓住所有被拒绝的promise?