简体   繁体   English

JavaScript - 用异步/等待替换 setTimeout

[英]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()不是Promiseawait不会做任何事情。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM