両方の約束がそれらの値を解決したときにロジックを実行するには、約束オブジェクト上でPromise.all()
を使用する必要があります。
Promise.all([promiseCurrencyKey, promiseStoreKey]).then(values => {
console.log(values);
});
JavaScriptは、何か起こるのを待っているコードを持つことを意味するシングルスレッド言語であり、他のすべてをブロックします。さて、しばらく時間がかかるかもしれないものがなければ、実際にはコードを書くことができません。これが約束です。
約束事のロジックがバックグラウンドで処理されており、コードをブロックしていません。 約束によって解決された値を使用するには、値が解決されたときに実行されるthen()
メソッドにコールバック関数を設定できます。
解決された値のときにコールバックが実行され、残りのコードが待機しないようにします。
だから、あなたのコードで起こるものを記述すると、以下の通りである:
- 実行解決された値がP1
- 印刷P1に設定し解決値
- ことを背景に、いくつかのロジック - logcでステップ1はまだ完了していないので、その関数のロジックも発生せず、値はまだp1に設定されません
同じようなことが起こりますp2の場合。
さて、あなたはPromise.all()
を使用しているとき、あなたは約束を2つの単純な空の変数にそれを実行していないので、結果は2つの空の変数を持つ配列であるオブジェクト...
2番目の例で編集した後、問題は、最初の約束関数内でpromiseBranchKeyを定義したため、この関数のスコープに対してのみ存在し、Promise.all()
を呼び出す場所からは外れていないことです。その約束2を考慮
let promiseMerchantKey = new Promise((resolve, reject) => {
firebase.database().ref('merchants').orderByChild('merchantName').equalTo('NTUC').once('value', function(snapshot) {
let merchantData = snapshot.val();
if (merchantData){
console.log('merchant exists');
resolve(merchantData.key);
}else{
// get merchant unique push ID
let merchantKey = firebase.database().ref('merchants').push({
address : "NTUC"
}).getKey();
resolve(merchantKey);
}
});
});
let promiseBranchKey = new Promise((resolve, reject) => {
firebase.database().ref('merchants').orderByChild('branchAddress').equalTo('Blk 167').once('value', function(snapshot) {
let branchData = snapshot.val();
if (branchData){
console.log('branch exists');
resolve(branchData.key);
}else{
// get branch unique push ID
promiseMerchantKey.then((merchantKey) => {
let branchKey = firebase.database().ref('merchants').child(merchantKey).push({
branchName : 'Marsiling',
branchAddress : 'Blk 167'
}).getKey();
resolve(branchKey);
});
}
});
});
promiseBranchKey.then((branchKey) => {
console.log('branchkey' + branchKey);
console.log('currencykey' + promiseMerchantKey);
});
は、あなたがそれの内部で使用then()
方法を持っており、最初の約束はすでに値を返した場合にのみ発生する約束2の決意を引き起こしすべき約束1によって解決された値に依存します。
約束1がすでに解決されている場合に限り、promise.all()
に必要はなく、約束事2を使用して両方の処理が行われたことを示すことができます。
プロビジョニングの作成後にp1とp2を直接ログに記録しようとしています。プロミスは非同期であるため、プロミスが解決されるまで値が設定されないため、未定義となっています。 また、promise.allは、約束が解決する値であり、約束自体ではありません。これは動作しません。 Promise.all p1、p2の値をpromiseStoreKeyとpromiseCurrencyKeyで切り替えると、より良い運を得ることができます。 – jas7457
javascriptプログラマには2種類あります。非同期コードを理解している人... –
@ jas7457ありがとうございましたp1とp2をあなたが言及した鍵に変更することで動作します! – guest176969