【发布时间】:2020-06-11 01:05:30
【问题描述】:
首先,我知道这是一个常见问题。我正在尝试了解如何使用 async / await 代替 setTimeouts,但是我在网上看到的所有示例都使用 setTimeout 来模拟异步。当我尝试替换设置的超时时,这会让我失望。
在下面的函数中,我希望 this.filteredResults 在尝试过滤这些结果并将其分配给 this.filteredResults 之前等待 API 调用的结果。
getResults() {
let allResults= airtableQuery.getTable("Transfers"); // API call using imported 'getTable' function
console.log(allResults); // returns full array ▶[] although it's not available for filtering yet.
setTimeout(() => { // I want to replace this timeout
this.filteredResults = allResults.filter(
(result) => result.fields.User === "dev"
);
}, 250); // random ms that is roughly how long airtableQuery takes for the API call.
},
还有airtableQuery:
getTable(table) {
let recordsArr = [];
base(`${table}`)
.select({
maxRecords: 8000,
})
.eachPage(
function page(records, fetchNextPage) {
records.forEach((record) => {
recordsArr.push(record);
});
fetchNextPage();
},
function done(err) {
if (err) {
this.$toasted.error(err);
}
}
);
return recordsArr;
},
【问题讨论】:
-
您需要提供
airtableQuery.getTable()的语义,以便任何人都能写出体面的答案。 -
您经常在有关 Promise 的问题中看到
setTimeout的原因是因为它是一种创建异步运行的简单方法。大多数异步功能都涉及外部服务器。 -
@RobbyCornelissen - 如果我们只是想在有限的信息中给出解决方案,那么对每个答案都投反对票的目的是什么。如果
getTable()是实际的Promise,Async/await就可以正常工作,因为它可以从最初的问题中指出。 -
@RobbyCornelissen 在大多数情况下会立即生效。我看不出如此消极的原因。您可以随时在答案下方的评论部分中根据附加信息编辑答案,直到您正确为止。
-
@RobbyCornelissen 正确,那是我的错。因此,我立即对其进行了编辑。我很抱歉。
标签: javascript asynchronous ecmascript-6 async-await