繁体   English   中英

JavaScript:在 Promise 中使用异步/等待

[英]JavaScript: Using Async/Await in a Promise

在学习异步 JavaScript 概念的过程中,我对可以链接的情况背后的想法感到困惑。 例如,考虑以下情况:webhook 调用云 function,并且要求设置云 function 响应 webhook 的时间间隔 在云中 function 被称为从数据库中获取一些数据的操作,它可以是短期或长期运行的任务。 出于这个原因,我们可能希望将 promise 返回到 webhook,只是为了“注册”未来的活动,然后提供结果,例如:

async function main () {
    return new Promise ((resolve, reject) => {
        try {
            db.getSomeData().then(data=> {
               resolve({ result: data});
            });
        } catch (err) {
            reject({ error: err.message });
        }
    });
}

另一种方法是使用async / await而不是 promise 来获取数据,例如:

async function main () {
    return new Promise (async (resolve, reject) => {
        try {
            const data = await db.getSomeData();
            resolve({ result: data });
        } catch (err) {
            reject({ error: err.message });
        }
    });
}

(代码是一个伪代码,因此对返回类型的所有检查都不被认为是重要的。)

await是否会阻塞第二个示例中的代码并阻止 promise 的返回?

async函数总是返回Promise 由 function 调用者决定如何处理它:通过使用then/catch链接或使用await 在您的示例中,无需创建并返回新的Promise

例如,您可以执行以下操作:

async function main () {
  try {
    const data = await db.getSomeData()
    return {result: data}
  } catch (err) {
    return {error: err.message}
  }
}

// On some other part of the code, you could handle this function
// in one of the following ways:
//
// 1. 
// Chaining the Promise with `then/catch`.
main()
  .then((result) => console.log(result)) // {result: data}
  .catch((err) => console.log(err))      // {error: err.message}
// 2. 
// Using await (provided we are working inside an asyn function)
try {
  const result = await main()
  console.log(result) // {result: data}
} catch (err) {
  console.log(err)    // {error: err.message}
}

尽量避免将两种处理异步操作的方法结合为最佳实践。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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