javascript中执行while循环异步的正确方法

javascript中执行while循环异步的正确方法,javascript,async.js,Javascript,Async.js,我想知道这样做的正确方法是什么 while(newList.length < 10){ async.series([ function(callback){ async.eachSeries(rest,function(id,next){ if(getDistance(myLoc,id) < 5){

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

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);
                });
        }
while(newList.length<10){
异步系列([
函数(回调){
eachSeries(rest,函数(id,next){
if(getDistance(myLoc,id)<5){
newList.push(id);
}
next();
});
回调();
},
函数(回调){
变量大小=10-newList.length
rest=getPlaces()
回调();
}],函数(错误,结果){
if(err)console.log('error发生在:'+err中);
});
}
rest每跑10个新位置,而asyc流程的第一步是确定10个位置的距离是否在5km以内,如果在5km以内,则将其添加到新列表中,如果不在5km以内,则我们将进行另一个循环,直到找到距离在5km以内的10个位置


虽然真正的想法是重新迭代,直到我的新列表中填充了10个(距离<10公里的位置),但当我尝试运行它时,它只遍历了所有内容一次,不会在第二次运行时循环。

我的建议是在while范围之外有一个布尔变量,默认情况下为true,当异步函数用10个元素填充列表时,设置为false。希望有帮助。

使用异步while而不是常规while:

var newList = [];
async.whilst(
    function(){ return newList.length < 10;},
    function(done) {
        async.series([
           function(callback){  
               var size = 10 - newList.length
               rest = getPlaces()
               callback();       
           },
           function(callback){
               async.eachSeries(rest,function(id,next){
                   if(getDistance(myLoc,id) < 5){
                        newList.push(id);
                   }
                   next();
               });
               callback();
           }], 
           function(err,results){
               if(err) console.log('error occured in : ' + err);
               done(err, newList);
           };    
    },
    function(results) {
        // New list has been filled
    }
})
var newList=[];
异步的(
函数(){return newList.length<10;},
功能(完成){
异步系列([
函数(回调){
变量大小=10-newList.length
rest=getPlaces()
回调();
},
函数(回调){
eachSeries(rest,函数(id,next){
if(getDistance(myLoc,id)<5){
newList.push(id);
}
next();
});
回调();
}], 
功能(错误、结果){
if(err)console.log('error发生在:'+err中);
完成(错误,新列表);
};    
},
职能(结果){
//新名单已经填好了
}
})

好的,这里有几个问题。
让我们从这个开始:

function(callback){         
    async.eachSeries(rest,function(id,next){
        if(getDistance(myLoc,id) < 5){
            newList.push(id);
        }
        next();
    });
    callback();
}
此外,您可能应该使用
系列
中的回调来生成结果数组,并在循环结束时对其进行处理,而不是让函数随机地、不可预测地填充内容。
例如:

async.whilst(
    function() { return newList.length < 10; },
    function(callback) {
        ...
    }, function(err, results) {
        console.log('loop has ended')
    }
)
function(callback){
    var list = []
    async.eachSeries(rest,function(id,next){
        if(getDistance(myLoc,id) < 5){
            list.push(id);
        }
        next();
    }, function(err) {
        callback(err, list);
    });
}
函数(回调){
变量列表=[]
eachSeries(rest,函数(id,next){
if(getDistance(myLoc,id)<5){
列表。推送(id);
}
next();
},函数(err){
回调(错误,列表);
});
}

我希望这能对您的问题有所帮助。

您的代码相当复杂,大多数用户甚至都不会试图理解它,您能通过删除不必要的部分来简化它吗?完成后,我希望它足够简单@Hatsuneya另外,在其他上下文中实际使用列表变量之前,您应该检查填充条件是否已满,因为JS将继续在后台运行异步代码,并且可能会从内存中对尚未填充的变量而不是由异步代码填充的变量实例启动一个函数。我尝试了这种方法,但最终列表填充了4xx,而当列表为10时,它应该会结束循环。我想知道发生了什么?以slo为例w、 一步一步地,确保一切按计划进行。我明白了!我忘了打回电话了。谢谢!