繁体   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