Javascript for循环不等待执行所有承诺

Javascript for循环不等待执行所有承诺,javascript,for-loop,asynchronous,react-native,Javascript,For Loop,Asynchronous,React Native,我在异步调用和for循环方面遇到了一些问题。我现在面临的是for循环从不等待所有承诺完成后再执行下一轮。我的代码框架如下: // removed code 有没有办法做到这一点,让for循环在执行下一轮之前等待我的所有承诺都执行完毕 我在这里写了一个原型,希望对您有所帮助: var donePromise = 0; let n = 10; for(let count = 0; count < n; count++){ DoAPromisse(function() {

我在异步调用和for循环方面遇到了一些问题。我现在面临的是for循环从不等待所有承诺完成后再执行下一轮。我的代码框架如下:

 // removed code 

有没有办法做到这一点,让for循环在执行下一轮之前等待我的所有承诺都执行完毕

我在这里写了一个原型,希望对您有所帮助:

var donePromise = 0;
let n = 10;
for(let count = 0; count < n; count++){
    DoAPromisse(function() {
        donePromise++;

        if (donePromise == n) {
            //all promisesses done
        }
    });
}
var donePromise=0;
设n=10;
for(让count=0;count
您也可以在调用self的函数中执行此操作:

function ramdomMerch (index, maxIndex) {
  count = index;
  count++;
  if (count > maxIndex) {
    exit(); //This will end the loop as soon as it hits the maxIndex
  }


  // random select merchant
  let randomMerchantName = new Promise((resolve, reject) => {
      merchantName = branchlist[branchIndex].merchantName;
      resolve(merchantName);
  });


            let promiseMerchantKey = new Promise((resolve, reject) => {
              randomMerchantName.then((merchantName) => {
                firebase.database().ref('merchants').orderByChild('merchantName').equalTo(merchantName).once('value', function(snapshot) {
                  var merchantData = snapshot.val();
                    if (merchantData){
                      console.log('merchant exists');
                      snapshot.forEach(function(childSnapshot) {
                        var item = childSnapshot.val();
                        item.key = childSnapshot.key;
                        resolve(item.key);
                      });
                    }else{
                      var merchantKey = firebase.database().ref('merchants').push({
                        merchantName : merchantName
                      }).getKey();

                      resolve(merchantKey);
                    }
                    ramdomMerch(count, maxIndex); // Here we simply call after finish the next "loop"
                });
              });
            });
}

randomMerch(1, 10); //We start it like an loop with the start and endIndex
与承诺合作的更好方式是运营商。 它的语法如下:

let promiseMerchantKey = new Promise(( ... 
promiseMerchantKey.then(function(value) {
   // Sucess, call next promise or next loop if it was the last
  }, function(reason) {
  // error
});

你要做的是把承诺连成一条链。你可以这样做:

//Just so we have a promise to start with for the chain.
let promiseMerchantKey = Promose.resolve();
for(let count = 0; count < 10; count++){

// random select category from list

// random select merchant
let randomMerchantName = promiseMerchantKey.then(()=>{
    return new Promise((resolve, reject) => {
        merchantName = branchlist[branchIndex].merchantName;
        resolve(merchantName);
    })
});

// create merchant
// check if merchant exists before add
promiseMerchantKey = randomMerchantName.then((marchantName)=>{
    return new Promise((resolve, reject) => {
        firebase.database().ref('merchants').orderByChild('merchantName').equalTo(merchantName).once('value', function(snapshot) {
                  var merchantData = snapshot.val();
                    if (merchantData){
                      console.log('merchant exists');
                      snapshot.forEach(function(childSnapshot) {
                        var item = childSnapshot.val();
                        item.key = childSnapshot.key;
                        resolve(item.key);
                      });
                    }else{
                      var merchantKey = firebase.database().ref('merchants').push({
                        merchantName : merchantName
                      }).getKey();

                      resolve(merchantKey);
                    }
                });
              });
});


// all other promises to insert record into different child

}
//这样我们就有了一个开始的承诺。
let PromiseMarchantKey=Promose.resolve();
对于(让计数=0;计数<10;计数++){
//从列表中随机选择类别
//随机选择商户
让randomMerchantName=PromiseMarchantKey。然后(()=>{
返回新承诺((解决、拒绝)=>{
merchantName=分支列表[branchIndex]。merchantName;
决议(商品名称);
})
});
//创建商户
//添加前检查商户是否存在
PromiseMarchantKey=randomMerchantName.then((marchantName)=>{
返回新承诺((解决、拒绝)=>{
firebase.database().ref('merchants').orderByChild('merchantName').equalTo(merchantName).once('value',函数(快照){
var merchantData=snapshot.val();
if(商品数据){
console.log(“商户存在”);
snapshot.forEach(函数(childSnapshot){
var item=childSnapshot.val();
item.key=childSnapshot.key;
解决(项.键);
});
}否则{
var merchantKey=firebase.database().ref('merchants').push({
商品名称:商品名称
}).getKey();
解决(merchantKey);
}
});
});
});
//所有其他承诺将记录插入不同的子对象
}

我在快照中看到一个
解析
。forEach
。。。这意味着您认为您可以不止一次地解决承诺。您可以设置一个标志来检查是否所有承诺都已完成,并在每次承诺完成时检查此标志。@JaromandaX抱歉,但您的意思是什么?是不是错了?@huydq5000标志在布尔变量中?你介意给我提供一些例子吗?forEach循环回调可以执行多次。。。然而,一个承诺只能解决一次,但上面的代码是随机选择商户10次,对吗?在运行下一轮之前,有没有办法强制for循环完成执行其中的任何内容?因为我的情况是,我想循环10次。每一次,我都随机生成类别、商户、分行等。在这个循环中,我需要得到随机选择的项目并插入firebase。在我完成插入所有其他部分后,我将运行第二次。我只是将您的代码复制到函数中,它实际上只会调用您的代码10次,并等待一次运行完成,然后再调用下一次。您只需添加其余代码并放置ramdomMerch(count,maxIndex);在你最后的承诺中。我想你希望它出现在你的insert promise中对不起,但是这个函数有点像for循环?所以我把我所有的承诺都放进去了,然后在最后一行我再次调用这个函数?它是否像Java一样自上而下执行?它告诉我randomMerch不是一个函数。你知道为什么吗?我写这封信的目的是,是的,这样你可以确保承诺完成。它运行top->down,但可以像java中那样跳转。这就是为什么在函数中分离承诺也是一个好主意。哦,还有,我主要是用打字机写的,所以我忘了函数标签,我会编辑它:DLets说我的PromiseMarketKey需要3个不同的随机承诺,例如,randomMerchantName,randomBranchAddress和randomBranchName,还有其他方法吗?让我们说有一种方法可以做到是的。您可以创建3个承诺,将它们存储在数组中并返回一个Promise.all(),这将确保在继续之前完成3个承诺。但这超出了你第一个问题的范围。