[英]JavaScript - replace setTimeout with async / await
First, I know this is a common question.首先,我知道这是一个常见问题。 I'm trying to get a handle on how to use async / await in place of setTimeouts, but all the examples I see online use a setTimeout to simulate the async.
我正在尝试了解如何使用 async / await 代替 setTimeouts,但是我在网上看到的所有示例都使用 setTimeout 来模拟异步。 This throws me off when it's a set timeout that I'm trying to replace.
当我试图替换设置的超时时,这会让我失望。
In the function below, I want this.filteredResults
to await the results of an API call before trying to filter those results and assign it to this.filteredResults
.在下面的 function 中,我希望
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.
},
And the 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;
},
Please make the outer function an async
function and then await
the results before filtering them.请将外部 function 设为
async
function,然后在过滤结果之前await
结果。
async function getResults() {
let allResults = await airtableQuery.getTable("Transfers");
this.filteredResults = allResults.filter(
(result) => result.fields.User === "dev"
);
},
Given that getTable()
is not a Promise
, await
will not do anything.鉴于
getTable()
不是Promise
, await
不会做任何事情。 For that reason, we can make getTable()
return a Promise
which will resolve with recordsArr
.出于这个原因,我们可以让
getTable()
返回一个Promise
,它将通过recordsArr
解析。
getTable(table) {
return new Promise((resolve, reject) => {
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);
reject(err)
}else {
resolve(recordsArr)
}
}
);
})
}
Hope it helps.希望能帮助到你。
i always likes primise,this my code show you我总是喜欢 primise,这是我的代码告诉你
getTable(table) {
return new Promise((res, rej) => {
let recordsArr = [];
base(`${table}`)
.select({
maxRecords: 8000,
})
.eachPage(
function page(records, fetchNextPage) {
records.forEach((record) => {
recordsArr.push(record);
});
fetchNextPage();
res(recordsArr)
},
function done(err) {
if (err) {
this.$toasted.error(err);
rej(err)
}
}
);
})
}
getResults() {
airtableQuery.getTable("Transfers").then(res => {
let allResults = res
console.log(allResults);
this.filteredResults = allResults.filter(
(result) => result.fields.User === "dev"
);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.