2016-09-28 12 views
1

私はOpenPGPライブラリを使用してフォームを暗号化するスクリプトを一般化しようとしています。次のコードは、各フォーム要素を取り、その値を暗号化する必要がありますwhileループの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]; 
} 

: 私は、クライアント側のコードといくつかのトラブル(Javascriptを)得ました。ただし、whileループは、非同期のencrypt()関数が解決されるのを待つことはありません。

私はこの場合に約束を使用する必要があると思うが、私は考えていないし、いくつかのチュートリアルはwhileループでは動作しなかった。

ヘルプ?

+0

フレームワークを使用していますか?フロントエンドまたは純粋なjavascriptに反応しますか? –

+0

@AkashBhandwalkar純粋なjavascriptとJQueryのみです。 – Squared

+0

私は答えました。私はそれが動作することを願って! –

答えて

2

はおそらく、このような何かのjQueryのDeferredのリストを使用することができます。もちろん

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!'); 
}); 

を、しかし私は$.Deferredmore cross-browser wayだと思う、$.Deferred代わりにネイティブPromiseオブジェクトを使用することができます。

UPD2:ネイティブPromisePromise.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!'); 
}); 
+0

それはうまくいった。ありがとうございました ! – Squared

+1

理論では、はい、しかし、[遅延反パターンを避ける](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

@Bergiはい、過剰な延期/約定を作成することは悪い習慣です。しかし、どのオブジェクトが 'encrypt'メソッドを返すのか、' $ .when() 'や' Promise.all() 'ではどのように動作するのか分かりません。このオブジェクトに '.then'メソッドが含まれているという事実。彼についてはあまり言いません。 アンチパターンなしで回答を更新しました。 – IStranger

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); 
    }); 
} 
+0

1つの問題tho、私はイテレータにも作業varを渡す必要があります。どうすればそれを達成できますか? – Squared

+0

ご覧ください。私は編集しました –

+0

エラーがありました、未定義の作業var。まだそれを働かせようとしている、tho。 – Squared