我有一个查询数据库的函数,因为我知道查询数据的函数是异步函数。问题是我如何才能为下面的代码编写承诺以实现同步,其中我需要将参数放入查询函数中。我部分地了解了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
}}
此功能的操作如下
任何建议都会感谢
答案 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)中异步/等待的更多信息。