在Array#map()中异步/等待

时间:2017-02-27 15:46:42

标签: javascript async-await ecmascript-2017

我使用此代码收到编译时错误:

const someFunction = async (myArray) => {
    return myArray.map(myValue => {
        return {
            id: "my_id",
            myValue: await service.getByValue(myValue);
        }
    });
};

错误信息是:

  

await是一个保留字

为什么我不能这样使用它?

我也尝试过另一种方式,但它给了我同样的错误:

 const someFunction = async (myArray) => {
    return myArray.map(myValue => {
        const myNewValue = await service.getByValue(myValue);
        return {
            id: "my_id",
            myValue: myNewValue 
        }
    });
};

4 个答案:

答案 0 :(得分:55)

您无法按照您的想象执行此操作,因为如果await不直接位于async函数内,则无法使用map

这里明智的做法是将函数传递给map异步。这意味着Promise.all将返回一组承诺。然后,我们可以使用Promise.all在所有承诺返回时获得结果。当async本身返回一个promise时,外部函数不需要是const someFunction = (myArray) => { const promises = myArray.map(async (myValue) => { return { id: "my_id", myValue: await service.getByValue(myValue) } }); return Promise.all(promises); }

unsigned long b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;

答案 1 :(得分:8)

那是因为map中的函数不是 async ,所以你不能在它的return语句中有等待。它编译了这个修改:

const someFunction = async (myArray) => {
    return myArray.map(async (myValue) => { // <-- note the `async` on this line
        return {
            id: "my_id",
            myValue: await service.getByValue(myValue)
        }
    });
};

Try it out in Babel REPL

所以...如果没有看到你的应用程序的其余部分就无法提供推荐,但是根据你想要做什么,要么使内部函数异步,要么尝试提出一些不同的这个街区的架构。

更新:我们可能会等待一天的最高级别:https://github.com/MylesBorins/proposal-top-level-await

答案 2 :(得分:1)

如果要使用异步映射功能运行地图,则可以使用以下代码:

select * from test_table_1 where col_1='value' and col_2='value';
select * from test_table_2 where col_1='value' and col_3='value';
select * from test_table_3 where col_1='value' and col_4='value';

工作方式:

  • const resultArray = await Promise.all(inputArray.map(async (i) => someAsyncFunction(i))); 返回一个promise数组-inputArray.map(async ...)中的每个值一个。
  • inputArray放在承诺数组的周围,将其转换为单个承诺。
  • 来自Promise.all()的单个诺言返回一个值数组-单个诺言将每个解析为一个值。
  • 我们将Promise.all()放在await的前面,以便我们等待组合的承诺解决并将已解决的子承诺数组存储到变量Promise.all()中。

最后,对于resultArray中的每一项,我们在resultArray中获得了一个输出值,并通过函数inputArray进行了映射。在结果可用之前,我们必须等待所有异步函数解析。

答案 3 :(得分:1)

这将是 2 个指令,但只需用额外的指令移动“等待”

let results = array.map((e) => fetch('....'))
results  = await Promise.all(results)