2017-01-10 16 views
0

后,可以说,我已经得到了下面的代码,呼叫下一个迭代每个回调

function someFunction(){ 
    var i = 0; 
    while (i < 10){ 
     someAsyncProcess(someField, function(err, data){ 
      i++; 
      // i want the next iteration of the while loop to occur after this 
     } 
    } 
} 

的someAsyncProcess运行,增量“我”。

但是,由于JavaScript的异步特性,while循环在i = 10之前运行了数千次。如果我想让while循环正好运行10次,该怎么办?如果我希望while循环仅在回调函数完成执行后才执行代码。

是否有可能没有setTimeout函数做到这一点?

请注意,我还是比较新的JavaScript,所以如果我错误地使用任何行话,纠正我。

+0

'while'是同步的循环迭代。您无法等到异步过程完成。在这种情况下,你不能使用'while'循环。 –

+0

任何替代品? –

+0

递归,带有promise的递归,rxjs – smnbbrv

回答

2

while是同步的。您无法等到异步过程完成。在这种情况下,您不能使用while循环。

相反,如果条件满足,您可以将代码放入函数中并再次调用函数本身。

例子:

function someFunction() { 
    var i = 0; 
    function step() { 
     if (i < 10) { 
      someAsyncProcess(someField, function(err, data) { 
       i++; 
       step(); 
      }); 
     } 
    } 
    step(); 
} 

有相当多的图书馆在那里,为这个现成的解决方案。一般来说,您可能还想查看promises

+0

这将调用异步函数ini循环,如果i值大于10 – Sajan

+0

@Sajan:当然,但是'i'在这里初始化为'0',小于'10'。 –

+0

多数民众赞成在okey,但他正在寻找一个while循环的替代方案,'我'的值可以是任何东西,所以值应该先检查之前调用函数 – Sajan

0

使用node package q这将帮助您返回承诺。您可以使用q按以下方式实现相同。

var q = require('q'); 
function someFunction(){ 

    var promises = []  
    var i = 0; 
    while (i < 10) { 
     promises.push(function() { 
      i++; 
      //write code here for using current value of i 
     }) 
    } 
    return q.all(promises); 
} 

你可以调用someFunction(),如下

someFunction().then(function(arrayOfResponseFromEachPromiseFunction) { 
    console.log(JSON.stringify(arrayOfResponseFromEachPromiseFunction, null, 4)); 
}).catch(function(err){ 
    console.log(err); 
}).done(); 

请纠正,如果你发现任何语法错误。希望能帮助到你。

0

您需要使用替换,同时用函数的递归

function someFunction() { 
    var i = 0; 
    (function asyncWhile() { 
     if (i < 10) { 
      someAsyncProcess(someField, function(err, data) { 
       //You code here 
       i++; 
       asyncWhile(); 
      }); 
     } 
    })(); //auto invoke 
}