Async / Await无法正常使用for循环语句

我是Java和Node.js的新手。在尝试了解promise和回调如何工作的同时,我尝试在“ for”循环中调用函数,如下所示。我试图实现的是使用诺言每2秒打印一次“ i”值。但是,该程序等待2秒钟,然后将i值打印3次并退出。

for(let i = 0; i < 3 ; i++){
    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);

    })
}

有人可以帮助我了解为什么会这样吗?

kx287973135 回答:Async / Await无法正常使用for循环语句

您可以使用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本身(enter image description here)。

您使用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..ofimmediately 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

大家都在问