2017-11-09 10 views
0

forEachループを実行してから、次の関数を実行できるようにPromiseを返す(解決する)必要があります。私は正しくforEachが終わったときにうまくいくが、プロミスを解決する方法を知らない。ここでforeachループが終了すると約束を返す

は私のコードです:

addSubmissionsForms(submissionId: string, submittedFields:Array<any>): Promise<any> { 
    const submissionPath:firebase.database.Reference = this.rootRef.child(`submissionsByID/${submissionId}/fields`); 

    submittedFields.forEach(function(submittedField, i) {  
     let fieldId = submittedField.id; 
     submissionPath.child(fieldId).update(submittedField); 
     if(i == submittedFields.length - 1) { 
     console.log('finished'); 

     } 
    }); 
    } 

私は約束を返すようにしたい理由は、私は、この関数が実行されるまで待つようにしたいので、このような別の関数を実行です:だから

this.submissionsProvider.addSubmissionsForms(submissionKey, this.submittedFields) 
    .then(() => { 
    this.navCtrl.pop(); 
    }); 
+0

次々に機能を実行することができますので、あなたが本当に約束を必要としない(例えば、AJAX呼び出しまたは読み取りとデータベースへの書き込みのように)何も非同期にない場合なぜこれは非同期ではないと約束する必要がありますか? –

+0

別の関数を実行する前にこの関数が実行されるまで待つ必要があります。私もコールバックでこれを行うために開きます – rhysclay

+3

ええ、この関数は非同期では何もしません。あなたはこの関数を呼び出してから、もう1つを呼び出すことができます。 –

答えて

2

を約束を使用する場合は、次のようにすることができます。

resolve('finished')

addSubmissionsForms(submissionId: string, submittedFields:Array<any>): Promise<any> { 
    return new Promise((resolve, reject) => { 
     const submissionPath:firebase.database.Reference = this.rootRef.child(`submissionsByID/${submissionId}/fields`); 

     submittedFields.forEach(function(submittedField, i) {  
      let fieldId = submittedField.id; 
      submissionPath.child(fieldId).update(submittedField); 
      if (i == submittedFields.length - 1) { 
       resolve(); 
      } 
     }); 
    reject(); 
    }); 
} 

機能addSubmissionsFormsは、あなただけの別の

addSubmissionsForms(); 
nextFunction(); 
関連する問題