我正在創(chuàng)建一個每隔一段時間刷新一次數(shù)據(jù)的函數(shù),而且我遇到了我的請求鏈問題.問題是我有一個for循環(huán)運行異步請求,for循環(huán)將在請求完成之前完成.
setInterval(function(){ // this updates the total hours of all members every 10 seconds request({ // this gets all of the loyalty program members url: "",//omitted method: "GET" }, function(listError, listResponse, listBody) { if(listError == null && listResponse.statusCode == 200) { var varBody = {}; var listObj = JSON.parse(listBody); for(var i = 0; i < listObj.result.length; i ) { // parses through all of the members to update their hours console.log(i);//****PRINT STATEMENT varBody.index = i; varBody.memberID = listObj.result[i].program_member.id; request({ //we do this request to get the steam ID of the program member url: "",//omitted method: "GET" }, function(fanError, fanResponse, fanBody) { var fan = JSON.parse(fanBody); if(fanError == null && fanResponse.statusCode == 200 && fan.result.profiles.length != 0) { // make sure that the profile isn't empty request({ url:"",//omitted method: "GET" }, function(hourError, hourResponse, hourBody) { if (hourError == null && hourResponse.statusCode == 200) { var gameList = JSON.parse(hourBody); var minutes = 0; for (var j = 0; j < gameList.response.games.length; j ) { // for loop to calculate the minutes each user has on steam minutes = gameList.response.games[j].playtime_forever; } var deltaHours = 1; if(deltaHours != 0) { var transaction = { // updated member object to be inserted pointsearned: deltaHours, pointsused: 0, loyaltyprogram_id: loyaltyID, programmember_id: memberID }; request({ // POST request to update the member url: "",//omitted method: "POST", body: JSON.stringify(transaction), headers: { "Content-Type": "application/json" } }, function(updateError, updateRes, updateBody) { if(updateError == null && updateRes.statusCode == 200) { console.log("Success");//****PRINT STATEMENT } } ); } } } ); } } ); } } console.log("Users Updated"); //****PRINT STATEMENT } );}, 10000);
如果我要運行此代碼,它將打?。?/p>
0123SuccessSuccessSuccessSuccess
我知道問題是什么.事實是for循環(huán)不等待請求完成.我不知道的是解決這個問題.有沒有人有任何想法?
解決方法:
你想要async庫.
例如,
for(var i = 0; i < listObj.result.length; i ) { varBody.index = i; varBody.memberID = listObj.result[i].program_member.id; request( ... , function () { // Do more Stuff });}
可以這樣寫:
async.forEachOf(listObj.result, function (result, i, callback) { varBody.index = i; varBody.memberID = result.program_member.id; request( ... , function () { // Do more Stuff // The next iteration WON'T START until callback is called callback(); });}, function () { // We're done looping in this function!});
在異步中有很多方便的實用程序函數(shù),這使得回調(diào)更容易.
來源:https://www.icode9.com/content-1-480351.html