如何在array.forEach中使用Javascript中的异步函数等待
问题描述:
我正在尝试在foreach
内提出async
请求,以便稍后为用户提取数据,但它不适用于我。如何在array.forEach中使用Javascript中的异步函数等待
我知道Array.Foreach
是一个同步函数,所以我甚至试过$ .when.done,但它仍然不会等到它完成。
我可以使用回调,如果它是一个单一的值,但它的数组。 有没有更好的方法来处理这个回调,以实现等待async
之后再移动呢?
browseItems.forEach((browseItem: any) => {
AsynchFunction();
cosole.log("Step 2")
}
function AsynchFunction(){
console.log("Step 1")
}
我试图得到一个输出像
步骤1
步骤2
答
一旦你开始使用异步函数,你去以下两种方式:callbacks
或promises
。在上面的代码中,你只需要定义一个在异步函数返回后调用的回调函数。请参见下面的示例:
browseItems.forEach((browseItem: any) => {
AsynchFunction(postProcess);
}
function AsynchFunction(callback){
console.log("Step 1");
if(asyncProcessDone){
callback();
}
}
function postProcess(){
console.log("Step 2")
}
答
是否有更好的方式,通过回调来处理这个实现移动未来
如果您正在使用的承诺,你可以使用一个函数像Promise.all
前等待异步REQ :
var promises = browseItems.map((browseItem: any) => AsynchFunction());
Promise.all(promises).then((values)=>{});
答
大厦@basarat's answer,我发现这工作得很好,如果你使用的是T中的async/await
功能ypeScript(如TS的1.7需要ES6目标):
async function processData(data: any[]) {
const promises = data.map(async (item) => {
await doSomeAsyncStuff(item);
//you can do other stuff with the `item` here
});
await Promise.all(promises);
//you can continue with other code here that will execute after all the async code completes
}
async function doSomeAsyncStuff(value) {
return new Promise((resolve, reject) => {
//call some async library or do a setTimeout and resolve/reject the promise
});
}
更新:async
和await
现在available for TypeScript code targeting ES5以及在打字稿的master
分支,即将发布的打字稿2.1。您可以使用npm install --save-dev [email protected]
更新:此功能适用于当前版本TypeScript中的所有ES目标。我注意到的一个警告是,如果您的目标是ES5或ES3,则需要提供Promise polyfill,否则代码将在旧版浏览器上失败。
这看起来很整齐,但似乎并没有实际工作。首先,你需要从“地图”中返回一些东西......但即使如此,它之后似乎也没有等待。 – dcsan
@dcsan在TypeScript中,当'await'函数返回一个promise时,包含'async'函数会自动返回一个'Promise',即使promise是'Promise'。你不需要从'.map'函数中返回任何东西。我已经使用过这种模式很多次了,并且效果很好。 –