如何写promise函数

时间:2018-09-26 01:03:34

标签: javascript typescript

我有一个查询数据库的函数,因为我知道查询数据的函数是异步函数。问题是我如何才能为下面的代码编写承诺以实现同步,其中我需要将参数放入查询函数中。我部分地了解了Promise函数的工作方式,但是作为一个初学者,很难编写类似的内容。

getTotalValues(){
 for(let weekrecords of this.week_records){
  this.selectPresentWeekData(weekrecords.weekid,weekrecords.croppingid); // asynchronous functions contains query in database
  this.loopThroughValues(); // must get the value from the query 
  this.loopObjectAccess(); // calculates the total using the values from the query
  this.pushDataToShow(weekrecords.weekid); // push the query data to a new object
}}

此功能的操作如下

  • 查询数据库->存储到对象->要提取的对象->然后进行计算->计算出的值将存储到新的对象数组中

任何建议都会感谢

2 个答案:

答案 0 :(得分:1)

@behrooz是正确的,您需要确保您返回的承诺将在完成所有异步工作后解决。在方法selectPresentWeekData中,您有3个查询。每个查询都返回一个Promise,然后您将处理数据。因此,您需要等待所有3个步骤完成,然后再解决。您可以将每个查询分配给一个变量。这样,您就可以存储承诺。

const x = db.query(...).then(...).catch(...);
const y = db.query(...).then(...).catch(...);
const z = db.query(...).then(...).catch(...);

在这种情况下,它们中的每一个将同时执行并在任何时候完成。使用Promise.all(),我们可以知道3个都完成了。

return Promise.all([x, y, z]);

通过返回Promise.all,您实际上是在说要等到所有3个操作都完成后才可以。然后,您可以使用@behrooz提供的代码,或者如果性能很重要,并且您希望每个迭代同时运行:

async function getTotalValues() {
  const presentWeekData = this.week_records.map(({ weekid, croppingid }) =>
    // for each record call your async, promise returning function
    this.selectPresentWeekData(weekid, croppingid)
      // when it finishes do these things
      .then(() => this.loopThroughValues())
      .then(() => this.loopObjectAccess())
      .then(() => this.pushDataToShow(weekid))
  );
  // now return a promise that waits for all those operations to finish
  return Promise.all(presentWeekData);
}

希望这会有所帮助!

答案 1 :(得分:0)

您可以使用async / await解决此问题。您可以将外部函数作为async函数,然后将await关键字用于该函数内部的所有异步调用。

async getTotalValues(){
 for(let weekrecords of this.week_records){
   await this.selectPresentWeekData(weekrecords.weekid,weekrecords.croppingid); // asynchronous functions contains query in database
   this.loopThroughValues(); // must get the value from the query
   this.loopObjectAccess(); // calculates the total using the values from the query
   this.pushDataToShow(weekrecords.weekid); // push the query data to a new object
 }
}

此外,您还必须确保您的selectPresentWeekData方法返回一个诺言,因此await等待该诺言得以解决。

您可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

上了解有关JS(和TS)中异步/等待的更多信息。