【发布时间】:2017-01-11 16:36:59
【问题描述】:
我有以下按预期工作的功能:
createObjectFrom(record) {
let obj = {};
this.opts.transformers.forEach((transformer, index) => {
const headerIndex = findIndex(this.headers, (header) => {
return header === transformer.column;
});
const value = transformer.formatter(record[headerIndex]);
obj[transformer.field] = value;
});
return obj;
}
我想重构它以使用 async await 并在 forEach 的主体中调用一个异步函数,如下所示:
createObjectFrom(record) {
let obj = {};
this.opts.transformers.forEach(async (transformer, index) => {
const headerIndex = findIndex(this.headers, (header) => {
return header === transformer.column;
});
const result = await this.knex('managers').select('name')
console.log(result);
const value = transformer.formatter(record[headerIndex]);
obj[transformer.field] = value;
});
return obj;
}
这显然会破坏函数,因为 forEach 现在正在异步执行,函数只会执行并离开。
有没有办法可以使用异步等待 forEach 以同步方式执行。我可以重构生成器吗?
【问题讨论】:
-
"这显然会破坏函数,因为 forEach 现在正在异步执行" --- 它不会改变任何东西。
Array.prototype.forEach不希望接受async函数,因此它将作为“正常”函数调用它。所以所有的函数都会被立即调用。 -
“有没有办法我可以使用异步等待 forEach 以同步方式执行” --- 只需使用
for或for-of循环遍历数组。您还必须将createObjectFrom更改为async。 -
这种东西你可以用this one顺利搞定,不介意用模块试试看。
标签: javascript node.js ecmascript-2017