Javascript 如何使用异步函数解决以下问题

Javascript 如何使用异步函数解决以下问题,javascript,asynchronous,Javascript,Asynchronous,我有一个javascript数组。我需要处理这个数组的每个元素,然后将整个数组存储到一个对象存储中。我对元素所做的处理应该是异步的。如下面的方法所示 var x = [ele1,ele2,ele3] ; x.forEach(function(ele,index){ if(ele == "some specific object"){ MyAPI.process("command",function(result){ x[index] = result; }); database.s

我有一个javascript数组。我需要处理这个数组的每个元素,然后将整个数组存储到一个对象存储中。我对元素所做的处理应该是异步的。如下面的方法所示

var x = [ele1,ele2,ele3] ; 

x.forEach(function(ele,index){

if(ele == "some specific object"){
MyAPI.process("command",function(result){ 

x[index] = result; 
});

database.store(x); 

异步计算时的问题是元素没有按顺序处理。关键是要跟踪当时已处理的结果的数量,并且只有在那时才调用store方法。最有效的方法是将对store方法的调用移动到回调中。这样,您就可以在最后一个元素的检查成功后直接调用它,而不必在检查标志条件时执行忙碌/等待。另一种可能是在处理最后一个元素时引发事件,并在事件处理程序(或类似的东西)中进行存储


MyAPI.process做什么?如果它最终主要调用AJAX服务,那么浏览器将已经异步执行该请求。如果您需要使用Javascript进行处理,那么使用
forEach
的第一个参数应该是回调,而不是数组本身。这是假设您在浏览器中工作。(您没有真正指定您的环境。)如果您在Node.js中工作,则上述方法根本不适用此方法的问题是我没有在X秒内处理“所有”元素。database.store操作不能在循环中发生,它需要在它之外发生。你需要计算出你将处理多少元素,然后对照该值检查结果的数量。您并没有严格地将其称为“在”循环中-它实际上在回调函数中,但只有在处理完所有的结果之后。我已经更新了示例。
var x = [ele1,ele2,ele3] ; 
var expectedResults = 0;
var results = 0;

x.forEach(x,function(ele,index) {
     if (ele == "some specific object") {
         ++expectedResults;
     }
});

x.forEach(x,function(ele,index){

    if (ele == "some specific object"){
        MyAPI.process("command",function(result){ 
           x[index] = result;
           if (++results == expectedResults) {
              database.store(x);
           }
        });
    }
});