【问题标题】:Return a promise when foreach loop ends当 foreach 循环结束时返回一个 Promise
【发布时间】:2018-04-22 10:58:20
【问题描述】:

我想运行一个 forEach 循环然后返回(解决?)一个 Promise 以便我的下一个函数可以运行。当 forEach 结束时我可以正确计算,但只是不知道如何解决 Promise。

这是我的代码:

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

      }
    });
  }

我想返回一个 Promise 的原因是因为我想等到这个函数运行之后再运行另一个这样的函数:

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

【问题讨论】:

  • 为什么你需要一个看起来不是异步的承诺?
  • 我想等到这个函数运行完再运行另一个函数,我也愿意用回调来做到这一点
  • 是的,但是这个函数不会做任何异步操作,不需要等待。您可以只调用此函数,然后调用另一个函数。
  • 完美-确实不需要异步,您能否在答案中对此进行更多解释?

标签: javascript typescript foreach firebase-realtime-database


【解决方案1】:

因此,如果您想使用 Promise,您可以执行以下操作:

作为旁注,您可以解决任何值,例如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 不执行任何异步操作(例如,ajax 调用或读取和写入数据库),则您实际上不需要 Promise,因为您可以一个接一个地执行函数

addSubmissionsForms();
nextFunction();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2014-10-26
    • 2021-09-24
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多