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