我正在尝试概括使用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循环中不起作用。
帮助?
答案 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
,但我认为$.Deferred
是more cross-browser way。
<强> UPD2:强>
改进了基于原生Promise
和Promise.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);
});
}