javascript - 在 javascript 中 while 循环异步的正确方法

标签 javascript async.js

我想知道这样做的正确方法是什么?

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/

相关文章:

javascript - jquery webcam plugin TypeError : webcam. capture is not a function 偶尔抛出

java - 支柱 2 <s :select> filling other fields within a form

javascript - 如何确保我的异步函数在调用下一个函数之前先执行

javascript - 有效地连接两个集合?

javascript - SAPUI5 - 存在异步函数时的路由问题

javascript - Facebook 分享按钮上的自定义文本

javascript - 显示隐藏的 Div 在提交时保持隐藏状态

javascript - 如何使用 expressjs 和 mongodb 使用 promise /回调?

node.js - AWS Lambda 异步并发限制

javascript - react 。 onCopy 事件的 preventDefault() 不起作用