异步循环按顺序排列

时间:2018-02-13 14:32:51

标签: javascript node.js

我想问为什么这个异步循环有效,但是当我改变它以使用函数作为参数时,它只打印出1个测试,然后只是跳到最后,就像没有任何反应一样。任何的想法 ?是因为功能只能使用一次或?或者你有更好的方法如何按顺序进行异步循环?

let array=[10,9,7,6,5,4];
fnBlockLoop(array)

    function timeoutTest(delay){
      return new Promise((resolve)=>{
        console.log("testing")
        setTimeout(resolve,delay)
      })
    }

    async function fnBlockLoop(input,func){
        for(const item of input){
            let test = await timeoutTest(2000);
            console.log(test)
        }
        console.log("done")
    }

2

    let array=[10,9,7,6,5,4];
    fnBlockLoop(array,timeoutTest(2000))


function timeoutTest(delay){
  return new Promise((resolve)=>{
    console.log("testing")
    setTimeout(resolve,delay)
  })
}

async function fnBlockLoop(input,func){
    for(const item of input){
        let test = await func;
        console.log(test)
    }
    console.log("done")
}

2 个答案:

答案 0 :(得分:1)

你想要的是传递函数参考timeoutTest。您目前所做的是传递函数调用timeoutTest( 2000 )的结果。后者是Promise,只能解析一次。

要传递实际的函数参考,你必须选择:

  1. 添加匿名函数包装器。这将允许您使用其他函数作为输入:fnBlockLoop(array, async function(){ await timeoutTest(2000) } )
  2. 传递函数参考及其参数。这需要对fnBlockLoop()函数进行一些调整:fnBlockLoop(array, timeoutTest, 2000 )

答案 1 :(得分:0)

  

您应该像这样传递函数引用。

   let array=[10,9,7,6,5,4];
    fnBlockLoop(array,timeoutTest)


function timeoutTest(delay){
  return new Promise((resolve)=>{
    console.log("testing")
    setTimeout(resolve,delay)
  })
}

async function fnBlockLoop(input,func){
    for(const item of input){
        let test = await func(2000);
        console.log(test)
    }
    console.log("done")
}