[英]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:
改進了基於原生Promise
和Promise.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.