您可以使用async
立即执行的函数包装循环,并在其中添加await
(如此处已建议的那样):
(async () => {
for(let i = 0; i < 3 ; i++){
await callback(i);
}
})();
function callback(i){
return new Promise((res,rej) =>{
setTimeout(()=>{
console.log('i = ',i)
res();
},2000);
})
}
这是我在Bergi编辑之前的原始答案:
(async () => {
for(let i = 0; i < 3 ; i++){
await func(callback,i);
}
})()
async function func(callback,i){
await callback(i);
}
function callback(i){
return new Promise((res,2000);
})
}
,
您非常接近。缺少的信息是async
个函数(您的func()
)隐式返回一个AsyncFunction
对象,该对象也隐式返回一个Promise本身()。
您使用doc的代码为
(async () => {
for(let i = 0; i < 3 ; i++){
await func(callback,i);
}
})()
async function func(callback,i){
await callback(i);
}
function callback(i){
return new Promise((res,rej) =>{
setTimeout(()=>{
console.log('i = ',i)
res();
},2000);
})
}
现在请注意,在大多数浏览器中,结构for await..of
(immediately invoked function expression)是本机可用的。您也可以尝试对此进行尝试。
,
这里有一些函数可以帮助您了解promise如何与Arrays一起使用,而我们会犯一些常见的错误。
function promiseFunction(v) {
return new Promise((resolve) => {
setTimeout(() => resolve(v),1000);
});
}
function f1() {
[1,2,3,4]. forEach(async(i) => {
const v = await promiseFunction(i);
console.log('-v-',v);
});
console.log('all done');
}
async function f2() {
await Promise.all([1,4].map(async(i) => {
const v = await promiseFunction(i);
console.log('-v-',v);
}));
console.log('all done');
}
async function f3() {
await [1,4].reduce((p,i) => {
return p.then(async () => {
const v = await promiseFunction(i);
console.log('-v-',v);
});
},Promise.resolve());
console.log('all done');
}
f1()将首先打印all done
,然后一秒钟后一次打印1,4。
f2()将在一秒后一次打印1,4,然后打印all done
。
f3()将每秒打印1,4,然后打印all done
。
,
您需要等待异步功能完成
for(let i = 0; i < 3 ; i++){
await func(callback,i);
}
但是由于您不能在全局范围内使用await
关键字,因此您需要将for
循环包装在异步函数中,然后调用它
async function myTest(){
for(let i = 0; i < 3 ; i++){
await func(callback,i);
}
}
myTest()
,
您的异步函数func还会返回一个promise,因此您需要在调用await关键字之前。
for(let i = 0; i < 3 ; i++){
await func(callback,i);
}
本文链接:https://www.f2er.com/2746649.html