簡體   English   中英

承諾在while循環javascript

[英]Promise in while loop javascript

我正在嘗試概括使用OpenPGP庫加密表單的腳本。 我遇到了客戶端代碼(Javascript)的麻煩:

var working = formID.elements[0];
var counter = 0;

while (working) {
    encrypt(working.value).then(function(encrypted_msg) {
        console.log("processing");
        working.value = encrypted_msg;
    });
    console.log("assuming processed");
    var counter = counter + 1;
    var working = formID.elements[counter];
}

以下代碼應采用每個表單元素並加密其值。 但是,while循環不等待異步encrypt()函數被解析。

我認為我需要在這種情況下使用promises,但我不知道如何和一些教程在while循環中不起作用。

救命 ?

可能可以使用jQuery延遲列表,如下所示:

var deferreds = [];

$.each(formID.elements, function(key, working){

    var deferred = $.Deferred();
    deferreds.push(deferred);

    encrypt(working.value).then(function(encrypted_msg) {
        console.log("processing");
        working.value = encrypted_msg;
        deferred.resolve();
    });

});

$.when.apply( $, deferreds ).done(function(){
    console.log( 'after all encryptions!' );
});

當然,可以使用原生的Promise對象代替$.Deferred ,但是我認為$.Deferred更多的跨瀏覽器方式

UPD2:

改進了基於原生PromisePromise.resolve()答案(感謝@Bergi)。 對於encrypt()返回正確promise的情況,可以跳過方法Promise.resolve()

var promises = [];

$.each(formID.elements, function(key, working){

    var promise = Promise.resolve(encrypt(working.value))
        .then(function(encrypted_msg) {
            console.log("processing");
            working.value = encrypted_msg;
        });

    promises.push(promise);

});

Promise.all(promises).then(function(){
    console.log( 'after all encryptions!' );
});
var iterator = [];
for (var counter = 0; counter < formID.elements.length; counter++) {
    var working = formID.elements[counter];
    iterator.push(encrypt(working.value));
}

Promise.all(iterator)
.then(fumction(data){
    //Here you have all data
})

您可以像這樣同步您的操作。 通過收集所有異步值引用並在它們具有數據時指向它們。

如果您的數據是依賴的。

function myfunction(previousValue){
    if(breaking Condition){
        return Promise.resolve();
    }
    return encrypt(working.value).then(function(encrypted_msg) {
        working.value = encrypted_msg;
        return myfunction(working);
    });
}

暫無
暫無

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

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