我想知道这样做的正确方法是什么?
while(newList.length < 10){
async.series([
function(callback){
async.eachSeries(rest,function(id,next){
if(getDistance(myLoc,id) < 5){
newList.push(id);
}
next();
});
callback();
},
function(callback){
var size = 10 - newList.length
rest = getPlaces()
callback();
}], function(err,results){
if(err) console.log('error occured in : ' + err);
});
}
rest 每次运行都会填充 10 个新位置,而 asyc 过程的第一步是找出这 10 个位置的距离是否在 5km 以内,如果在 5km 以内,则将其添加到 newList,如果不是然后我们再做一个循环,直到它找到10个距离在5公里以内的地方
虽然真正的想法是重新迭代直到我的 newList 充满 10(距离 < 10 公里的地方),但当我尝试运行它时,它只遍历所有内容一次并且不会循环进行第二次运行.
最佳答案
好的,所以你这里有几个问题。
让我们从这个开始:
function(callback){
async.eachSeries(rest,function(id,next){
if(getDistance(myLoc,id) < 5){
newList.push(id);
}
next();
});
callback();
}
您不是在等待 eachSeries
的输出,而是在启动它并立即回调。
该函数将独立地填充您的 newList
,可能立即,也可能稍有延迟;你不会知道的,因为你马上回电了。
您在此处使用 series
也不会获得任何好处,因为它应该在前一个函数完成后运行每个函数。
您的代码最终可能会像这样工作:
- 启动异步系列
- 运行第一个函数
- 该函数开始一个 async.eachSeries
- 函数回调
- 第二个函数开始,
newList
还没有填满 - 第二个功能结束
- 循环结束
newList
仍未填充
除此之外,您的 while
函数也不必等待任何事情,它会一遍又一遍地无意识地运行 async.series
,直到您的 newList
被填满,很可能会占用大量资源。
您可以改用 async.whilst
之类的函数,例如:
async.whilst(
function() { return newList.length < 10; },
function(callback) {
...
}, function(err, results) {
console.log('loop has ended')
}
)
此外,您可能应该使用 series
中的回调来生成结果数组,并在循环结束时处理它们,而不是让函数随机且不可预测地填充内容。
例如:
function(callback){
var list = []
async.eachSeries(rest,function(id,next){
if(getDistance(myLoc,id) < 5){
list.push(id);
}
next();
}, function(err) {
callback(err, list);
});
}
我希望这能对您的问题有所启发。
关于javascript - 在 javascript 中 while 循环异步的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747447/