簡體   English   中英

等待for循環的承諾

[英]Wait for promises from a for loop

下面的代碼並沒有真正做到我想要的。

function doIt () {
  return new Promise (function (resolve, reject) {
    var promises = [];
    db.transaction(function(tx1){
      tx1.executeSql(function(tx2, rs) {
        for (var i = i; i < N; i++) {
          promises.push(db.transaction(function(tx3){
            ...
          }));
        }
      });
    });
    Promise.all(promises).then(resolve);
  });
}

現在它不起作用了,因為Promise.all()在所有的Promise都在數組中之前就已經執行了,至少我認為是正確的。

有沒有一種優雅的方法可以保證在這些承諾結束之前完成所有這些承諾?

您可以只移動Promise.all()的位置,以便在for循環完成填充數組之后就可以了:

function doIt () {
  return new Promise (function (resolve, reject) {
    var promises = [];
    db.transaction(function(tx1){
      tx1.executeSql(function(tx2, rs) {
        for (var i = i; i < N; i++) {
          promises.push(db.transaction(function(tx3){
            ...
          }));
        }
        Promise.all(promises).then(resolve);
      });
    });

  });
}

僅供參考,混合承諾和回調可能會造成混淆,並使一致的錯誤處理特別困難。 tx1.executeSql()是否已返回諾言? 如果是這樣,您可以僅使用數據庫函數已經創建的promise來做一些更干凈的事情:

function doIt() {
    return db.transaction.then(function(tx1) {
        return tx1.executeSql().then(function(tx2, rs) {
            var promises = [];
            for (var i = i; i < N; i++) {
                promises.push(db.transaction().then(function(tx3) {
                    ...
                }));
            }
            return Promise.all(promises).then(resolve);
        });
    });
}

這將從.then()處理程序返回promise .then()以自動將promise鏈接在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM