Javascript - 将两个函数 then/catch 样式更改为 async/await 样式

Javascript - Change two function then/catch style into the async/await style

我正在尝试了解 .then() 函数如何获得这样的两个参数。

const promise = doSomething();
const promise2 = promise.then(successCallback, failureCallback);

const promise2 = doSomething().then(successCallback, failureCallback);

但我想像这样将两个参数 .then() 转换为 async/await

const result = await doSomething()
// execute successCallback if success.
// execute failureCallback if failure.

这是我正在努力学习的网站。

Mozilla Firefox Developer : Using promise

Mozilla Firefox Developer : Promise Chaining

使用try...catch

try {
  const result = await doSomething()
  // success
  successCallback();
}

catch (e) {
  // error
  failureCallback();

您可以将 doSomething 包装在一个 try catch 方法中,以像这样捕获成功和失败。

try {
const result = await doSomething()
} catch (err) {
console.log(err.message)
}

当你 await 一个 resolve 的 promise 时,你直接得到它的值:

const result = await doSomething();

当您 await 一个拒绝的承诺时,它会抛出一个异常,您可以让该异常传播回当前函数的调用者(作为一个被拒绝的承诺,因为所有 async 函数 return promise 和 async 函数将未捕获的异常变成被拒绝的 promise)或者你可以在本地使用 try/catch.

自己捕获它
try {
   const result = await doSomething();
} catch(e) {
   console.log(e);
}

不建议将承诺映射到回调。最好只 return 承诺,让调用者直接使用 .then()await.

处理承诺

如果您确实需要将 await 映射到 successCallbackfailureCallback,那么您可以这样做:

try {
   const result = await doSomething();
   successCallback(result);
} catch(e) {
   failureCallback(e);
}

但是,到那时,您也可以只使用 .then(),因为它的代码更少:

 doSomething().then(successCallback, failureCallback);

但是,正如我之前所说,您通常不想将承诺映射到回调中。您更有可能将较旧的 callback-based API 包装到 promise 中,这样您就可以对所有 control-flow 而不是 mix/match 模型使用 promises(当您混合模型时,这往往会使良好的错误处理变得非常复杂) .