简体   繁体   English

承诺在while循环javascript

[英]Promise in while loop javascript

I'm trying to generalize a script that encrypts forms using OpenPGP libraries. 我正在尝试概括使用OpenPGP库加密表单的脚本。 I got some troubles with the client-side code (Javascript) : 我遇到了客户端代码(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];
}

The following code should take each form element and encrypt its value. 以下代码应采用每个表单元素并加密其值。 However, the while loop doesn't wait for the asynchronous encrypt() function to be resolved. 但是,while循环不等待异步encrypt()函数被解析。

I think i need to use promises in this case, but i have no idea how and the few tutorials didn't work in a while loop. 我认为我需要在这种情况下使用promises,但我不知道如何和一些教程在while循环中不起作用。

Help ? 救命 ?

Probably can be used list of jQuery deferreds, something like this: 可能可以使用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!' );
});

Of course, can be used native Promise object instead $.Deferred , however I think $.Deferred is more cross-browser way . 当然,可以使用原生的Promise对象代替$.Deferred ,但是我认为$.Deferred更多的跨浏览器方式

UPD2: UPD2:

Improved answer based on native Promise and Promise.resolve() (thanks to @Bergi). 改进了基于原生PromisePromise.resolve()答案(感谢@Bergi)。 For the case when encrypt() returns correct promise, method Promise.resolve() can be skipped. 对于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
})

You can synchronize your operation like this way. 您可以像这样同步您的操作。 By collecting all asynchronus value references and point to them when they have data. 通过收集所有异步值引用并在它们具有数据时指向它们。

In case your data is dependent. 如果您的数据是依赖的。

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