2017-01-10 21 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 
}