Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
while循环javascript中的承诺_Javascript - Fatal编程技术网

while循环javascript中的承诺

while循环javascript中的承诺,javascript,Javascript,我试图概括一个使用OpenPGP库加密表单的脚本。 我在客户端代码(Javascript)方面遇到了一些问题: 下面的代码应该采用每个表单元素并加密其值。但是,while循环不会等待异步encrypt()函数被解析 我认为我需要在这种情况下使用承诺,但我不知道如何使用承诺,而且这几个教程在一段时间内没有起作用 帮助?可能用于jQuery延迟列表,如下所示: var deferreds = []; $.each(formID.elements, function(key, working){

我试图概括一个使用OpenPGP库加密表单的脚本。 我在客户端代码(Javascript)方面遇到了一些问题:

下面的代码应该采用每个表单元素并加密其值。但是,while循环不会等待异步encrypt()函数被解析

我认为我需要在这种情况下使用承诺,但我不知道如何使用承诺,而且这几个教程在一段时间内没有起作用


帮助?

可能用于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:

基于本机
Promise
和(感谢@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!' );
});

您是否使用任何用于前端或纯javascript的angular/react框架?@akashbhandwarkar仅使用纯javascript和JQuery。我回答。我希望它能起作用!您也可以使用递归函数。第一次异步成功时的Like调用函数call@Square,下一个表单元素加密是否依赖于上一个表单元素加密?一个问题是,我还需要将工作变量传递给迭代器。我怎么能做到呢?有一个错误,未定义的工作变量。仍然试图让它工作,虽然。理论上,是的,但是@Bergi是的,创建过多的延期/承诺是不好的做法。但是我不知道什么对象返回
encrypt
方法,以及它将如何使用
$.when()
Promise.all()
。事实上,这个对象包含
。然后
方法,关于他没什么好说的。我在没有反模式的情况下更新了答案。@IStranger如果您不知道它返回什么,您可以始终使用
Promise.resolve(加密(…)
(或
$。当(在jQuery中加密(…)
)时,这就是它们的用途。@Bergi谢谢,这是一个很棒的方法)。我喜欢类似的方法,它允许在不使用
if
语句和附加抽象层的情况下统一类型。我用它改进了答案。
function myfunction(previousValue){
    if(breaking Condition){
        return Promise.resolve();
    }
    return encrypt(working.value).then(function(encrypted_msg) {
        working.value = encrypted_msg;
        return myfunction(working);
    });
}
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!' );
});
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!' );
});