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

如何在JavaScript Promise中使用异步/等待语法忽略错误。全部()

郭琨
2023-03-14

我正在尝试运行一个for循环,它将一组异步请求排队。所有请求完成后,不管它们是解析还是拒绝,我都想运行一些代码。我试图利用异步/等待模式,因为它看起来更好。:)

这就是我正在做的:

var promises = []
for ( item in list ) {
    prom = AsyncFunction( item )
    promises.push(prom)
}

await Promise.all(promises)

doMoreAfter()

然而,有些promise失败了,第二种情况是promise。all()也会失败。

我想简单地忽略任何失败的promise,并在所有promise完成后运行下一段代码。

我找到了这样的解决方案。

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));

但当试图将其转换为异步/等待格式时,它看起来不起作用。

await Promise.all(promises.map(p => p.catch(e => e)))

我错过了什么?

共有2个答案

薛涛
2023-03-14

我试着这样运行您的示例:https://jsfiddle.net/804ogadu/3/

var a = Promise.resolve('a');
var b = Promise.resolve('b')
var c = Promise.reject('errc');

async function test(){
const t = await Promise.all([a, b, c].map(p => p.catch(e => e)));
console.log(t);
}

test();

我确实得到了要求的结果

['a,'b','errc']
臧欣怿
2023-03-14

我觉得你能做的最好的就是:

var promises = [a, b, c];
promises = promises.map(p => p().catch(e => undefined));

values = await Promise.all(promises);
console.log(values);  // ["a", undefined, "c"]

https://jsfiddle.net/DerekL/h5Lmxaqq/

或者您可以创建一个忽略函数:

function ignore(promise){
    return promise.catch(e => undefined);
}

async function main(){
    var promises = [a(), b(), c()];

    var values = await Promise.all(promises.map(ignore));
    console.log(values);
}

https://jsfiddle.net/DerekL/mwkww7w9/

 类似资料:
  • 我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase

  • 问题内容: 示例了如何使用内置的加密库和流来计算文件的md5。 但是是否可以将其转换为使用ES8异步/等待而不是使用上述回调,但仍保持使用流的效率? 问题答案: / 仅适用于promise,不适用于流。有一些想法可以制作一种类似流的额外数据类型,该数据类型将具有自己的语法,但是如果有的话,这些想法是高度实验性的,我将不赘述。 无论如何,您的回调仅等待流结束,这非常适合兑现承诺。您只需要包装流: 现

  • 问题内容: 我一直在浏览/ 在浏览了几篇文章之后,我决定自己测试一下。但是,我似乎无法绕开为什么这行不通的想法: 控制台输出以下内容(节点v8.6.0): 外部:[对象承诺] 内部:嘿 为什么函数内部的日志消息随后执行?我认为创建/ 的原因是为了使用异步任务执行同步执行。 有没有办法可以使用函数内部返回的值而不使用after ? 问题答案: 我似乎无法绕开为什么这行不通的想法。 因为回报承诺;所有

  • 我想进行一个基于当前状态的API调用,但不能使setState函数作为异步函数工作。 给我错误: 类型为“”的参数(状态:只读)= 如果我在setState方法之外获取数据,它会起作用,但我害怕对过时的页码进行API调用:

  • 我需要在函数中运行各种步骤,但步骤必须按特定顺序运行。我尝试实现一个函数,如下所示: 控制台中的预期结果应该是1,2,3,但我得到了3,2,1。似乎忽略了参数。 编辑功能在上面的示例中仅用于模拟繁重的任务。在我的项目中,我不会使用它。事实上,我需要连接到一个数据库,然后在进入下一步之前重新格式化结果。即使包括,2也会在1之前登录。换句话说,空列表被传递到我的图形,因为没有考虑。以下是我当前的代码:

  • 我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。