async/await 虽然取代了回调,使用类似同步的代码组织方式让代码更加简洁美观,但错误处理时需要加 try/catch 。
比如下面这样,一个简单的 Node.js 中使用 const fetch = require("node-fetch"); async function getData() { const url = "https://api.github.com/users/wayou"; try { const response = await fetch(url); const data = await response.json(); console.log(data); } catch (error) { throw error; } } getData(); 像这样的异步场景,Node.js 中会有很多。如果都通过 将异步进行一层封装因为本质上 比如下面这样: function await2js(promise) { return promise.then(result => [undefined, result]).catch(error => [error, undefined]); } 该方法始终返回两个结果,第一个是错误,第二个是数据,这和 Node.js 中回调的入参 所以改造后的使用示例: async function getData() { const url = "https://api.github.com/users/wayou"; const [error, response] = await await2js(fetch(url)); if (error) { throw error; } const [error2, data] = await await2js(response.json()); if (error2) { throw error2; } console.log(data); } 这层封装针对单个 当然,如果嫌麻烦,也可通过 TypeScript 版本function await2js<T, K = Error>(promise: Promise<T>) { return promise .then<[undefined, T]>((response: T) => [undefined, response]) .catch<[K, undefined]>((error: K) => [error, undefined]); } 这里有个相应的 npm 包便是做这事情的 await-to-js。 相关资源 |
原文地址:https://www.cnblogs.com/Wayou/p/elegant_async_await.html
时间: 2024-10-02 08:38:31