簡體   English   中英

JavaScript的承諾-等待解析,然后繼續

[英]JavaScript Promises - Waiting for resolution before moving on

我需要執行以下操作:

  1. 通過調用內部函數(getLines())獲得“行”列表。
  2. 選擇第一行,執行一個動作
  3. 上一個操作完成后,選擇下一行並執行相同的操作
  4. 對所有行重復(3-20行,具體取決於用戶)

我有以下代碼:

App.Lines = response.data;    
for (var _i = 0; _i < App.Lines.length; _i++) {
    var makeCallPromise = new Promise(
        function(resolve, reject) {
            Session.connection.ol.makeCall(App.Lines[_i], callBackFunction(response) {
                //this can take up to 30 seconds to respond...
                resolve(response.data);
            }, errorCallBackFunction(message) {
                reject(message.error);
            }, bareJid);
        }
    )
    makeCallPromise.then(function(fulfilled) {
        console.log("PROMISE WORKED!!!!!", fulfilled);
    })
    .catch(function(error) {
        console.log("PROMISE FAILED!!!!!", error);
    });
}

我希望該循環在繼續執行該循環之前將等待解決諾言,但是事實並非如此。 我的問題是在解決方案完成之前是否可以暫停循環。 注意-我正在使用bluebird JS庫進行承諾。 謝謝!

親切的問候,

加里

我不了解bluebird,但是您可以執行類似的操作來創建某種for循環,以等待每個promise在下一次迭代之前結束。

這是一個通用示例,當然可以對其進行優化,這只是一個快速嘗試:

var i = 0;
var performAsyncOperation = function(operationNumber) {
    return new Promise(function(resolve, reject){
    console.log('Operation number', operationNumber);
    resolve();
  });
}

var chainAsyncOperations = function() {
    if(++i < 10) {
        return performAsyncOperation(i).then(chainAsyncOperations);
    }
};
performAsyncOperation(i).then(chainAsyncOperations);

希望這對您有幫助;)

您可以使用bluebird提供的Promise.each() ,它將順序遍歷一個數組並等待它們解析,然后再移至數組中的下一個元素

該用例與ES7功能async await完全匹配,如果您可以使用babeljs轉換代碼,則可以像下面這樣重構函數:

function createPromise(line) {
    return new Promise(
       function(resolve, reject) {
          Session.connection.ol.makeCall(line, callBackFunction(response) {
              //this can take up to 30 seconds to respond...
              resolve(response.data);
          }, errorCallBackFunction(message) {
              reject(message.error);
          }, bareJid);
       }
    );
}

App.Lines = response.data;

async function main() {
    for (var _i = 0; _i < App.Lines.length; _i++) {
        try {
           var result = await createPromise(App.Lines[_i]);
           console.log(result);
        } catch (err) {
           console.log(err);
        }
    }
}

main().then(function() {
    console.log('finished');
});

您應該使用Bluebird#each方法:

.each(函數(任何項目,int索引,int長度)迭代器)-> Promise

遍歷數組或數組的promise,該數組或promise包含帶有給定迭代器函數的promise(或promise和值的混合)以及簽名(值,索引,長度),其中value是輸入數組。 迭代是串行發生的。 如果輸入數組中的任何承諾被拒絕,則返回的承諾也將被拒絕。

Promise.each(App.Lines, line => {
    return new Promise((resolve, reject) => {
        Session.connection.ol.makeCall(line, callBackFunction(response) {
            resolve(response.data);
        }, errorCallBackFunction(message) {
            reject(message.error);
        }, bareJid);
    })
    .then(fulfilled => console.log("PROMISE WORKED!!!!!", fulfilled))
    .catch(err => onsole.log("PROMISE FAILED!!!!!", err));
});

暫無
暫無

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

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