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

对Array.map使用异步等待

步胜
2023-03-14
问题内容

给出以下代码:

var arr = [1,2,3,4,5];

var results: number[] = await arr.map(async (item): Promise<number> => {
        await callAsynchronousOperation(item);
        return item + 1;
    });

产生以下错误:

TS2322:类型’Promise []’无法分配给类型’number []’。类型’Promise
不可分配给类型’number’。

我该如何解决?怎样才能让async awaitArray.map一起工作?


问题答案:

这里的问题是,您正在尝试await兑现承诺而不是承诺。这没有达到您的期望。

当传递给的对象await不是Promise时,await只需立即按原样返回值,而不是尝试解析它。因此,由于您await在此处传递了(Promise对象的)数组而不是Promise,所以await返回的值就是该数组,其类型为Promise<number>[]

您需要在此处调用Promise.all返回的数组map,以便在使用前将其转换为单个Promise await

根据MDN文档Promise.all

Promise.all(iterable)方法返回一个promise,当可迭代参数中的所有promise都已解决时,该promise会解决;或者以第一个传递的promise拒绝为由拒绝。

因此,在您的情况下:

var arr = [1, 2, 3, 4, 5];

var results: number[] = await Promise.all(arr.map(async (item): Promise<number> => {
    await callAsynchronousOperation(item);
    return item + 1;
}));

这将解决您在此处遇到的特定错误。



 类似资料:
  • 几周前刚开始学Node.js....我不明白为什么“products”数组包含null而不是所需的对象.... 在第13行,当我对对象进行控制台日志记录时,我得到了所需的对象,但我不明白当我在map函数完成它的执行后在第40行对它们进行控制台日志记录时,它们为什么是空的.... 如果数组长度是2(这意味着推入成功),为什么里面存储的对象仍然是空的,而不是我想要存储的对象? 控制台输出 订单模式

  • 问题内容: 我能指望每次调用doSomething()时完成的nodeID映射吗? 我以为node.js中的所有回调都是异步的?我确实读过一篇关于通用编程的文章,说回调可以是同步的,但是我不确定node.js吗? 问题答案: JavaScript也是一种功能编程语言。您在这里拥有的是“高阶函数”,该函数将函数作为参数。高阶函数是同步的(但请参见下面的注释)。 资料来源: 功能编程 JavaScri

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

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我想使用异步并等待处理承诺。我想在下面的示例中使用这个方法: 在执行时,它给了我一个错误 错误: UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:3)

  • 问题内容: 我正在构建一个使用的库,我想知道是否可以将本机模块与一起使用。我知道这只是背景中的Promises,所以有本机的方法来实现方法或功能的实现吗?目前,我正在使用Bluebird,但我不知道这是否是一个坏模式。 例: 我将原生Promises和Bluebird结合在一起。我应该只使用Bluebird吗? 问题答案: 我正在构建一个使用async / await的库,我想知道是否可以在asy