承诺在while循环javascript

时间:2016-09-28 16:49:26

标签: 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循环中不起作用。

帮助?

2 个答案:

答案 0 :(得分:2)

可能会使用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,但我认为$.Deferredmore cross-browser way

<强> UPD2:

改进了基于原生PromisePromise.resolve()的答案(感谢@Bergi)。对于encrypt()返回正确承诺的情况,可以跳过方法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!' );
});

答案 1 :(得分:1)

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);
    });
}