我正在制作一个经常刷新数据的函数,而我的请求链存在问题。问题是我有一个运行异步请求的for循环,并且for循环将在请求完成之前完成。
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);
如果我要运行此代码,它将显示:
0 1 2 3 Success Success Success Success
我知道是什么问题。事实上,for循环不会等待请求完成。我不知道这是一种解决方法。有人有什么想法吗?
您需要异步库。
例如,
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! });
异步中有很多方便的实用程序函数,这些函数使回调的使用变得更加容易。