Javascript for循环等待callback

我有这个function:

function tryStartLocalTrendsFetch(woeid) { var userIds = Object.keys(twitClientsMap); var isStarted = false; for (var i = 0; i < userIds.length; i++) { var userId = userIds[i]; var twitClientData = twitClientsMap[userId]; var isWoeidMatch = (woeid === twitClientData.woeid); if (isWoeidMatch) { startLocalTrendsFetch(woeid, twitClientData, function (err, data) { if (err) { // Couldn't start local trends fetch for userId: and woeid: isStarted = false; } else { isStarted = true; } }); // This will not obviously work because startLocalTrendsFetch method is async and will execute immediately if (isStarted) { break; } } } console.log("No users are fetching woeid: " + woeid); } 

这种方法的要点是,我想要的行if (isStarted) { break; } if (isStarted) { break; }工作。 原因是,如果它开始,它不应该继续循环,并尝试启动另一个。

我在NodeJS中这样做。

尝试使用recursion定义

 function tryStartLocalTrendsFetch(woeid) { var userIds = Object.keys(twitClientsMap); recursiveDefinition (userIds, woeid); } function recursiveDefinition (userIds, woeid, userIndex) var userId = userIds[userIndex = userIndex || 0]; var twitClientData = twitClientsMap[userId]; var isWoeidMatch = (woeid === twitClientData.woeid); if (isWoeidMatch && userIndex<userIds.length) { startLocalTrendsFetch(woeid, twitClientData, function (err, data) { if (err) { recursiveDefinition(userIds, woeid, userIndex + 1) } else { console.log("No users are fetching woeid: " + woeid); } }); } else { console.log("No users are fetching woeid: " + woeid); } } 

你也可以使用asyncnpm install async ):

 var async = require('async'); async.forEach(row, function(col, callback){ // Do your magic here callback(); // indicates the end of loop - exit out of loop }, function(err){ if(err) throw err; }); 

更多的材料来帮助你: Node.js – 使用async lib – async.foreach和object