阅读 722
一天一工具 —— await-to-js

一天一工具 —— await-to-js

今天介绍一个 npm 包 —— await-to-js。它可以有效地帮助我们写出健壮的异步逻辑,降低异步编写成本。

众所周知,Promise 是 es6 当中一个非常方便的流程控制对象,大大简化了异步逻辑的编写。如果你写过早期的类似以下的回调代码:

doAsync1(function (r1) {
  doAsync2(r1.xxx, function (r2) {
    doAsync3(r2.xxx, function (r3) {
      doAsync4(r3.xxx, function (r4) {
    })
  })
})
复制代码

发现回调式的异步逻辑的层层递进会不断地让你的代码向右缩进,一些复杂的异步逻辑甚至需要套上十几次回调函数。而 Promise 的出现拯救了我们,通过链式传递的方式,Promise 有效地减少了回调嵌套的问题。

doAsync1()
  .then(r1=>{
    return doAsync2(r1.xxx)
  })
  .then(r2=>{
    return doAsync3(r2.xxx)
  })
  .then(r3=>{
    return doAsync4(r3.xxx)
  })
复制代码

这种链式调用方式将回调打平了,但依旧需要一遍一遍写回调,且很难将之前的返回结果传递下去(如 doAsync3 没办法拿到r1),于是有了 async&await 语法糖。

const r1 = await doAsync1();
const r2 = await doAsync2(r1.xxx);
const r3 = await doAsync3(r2.xxx);
const r4 = await doAsync4(r3.xxx);
复制代码

async&await 将异步的逻辑用近似同步的语法表达了出来,连回调都消失了,更加清晰易读,这是件很棒的事情。

但随之又出现了一个问题,错误怎么处理,难道让它粗鲁地抛出去就不管了?如果你想要让你的程序更加健壮、鲁棒,错误处理必不可少。await 的语法同样需要使用 try catch 来捕获错误。

try{
    const r1 = await doAsync1();
    try{
      const r2 = await doAsync2(r1.xxx);
        try{
          const r3 = await doAsync3(r2.xxx);
          //          ...
        } catch(e3){
        }
    } catch(e2){
    }
}catch(e1){
}
复制代码

嵌套地狱它竟然又回来了!!!

这时候 await-to-js 就派上了用场。

import to from 'await-to-js';
const [err1, r1] = await to(doAsync1());
if(err1){
 // 错误处理
}
const [err2, r2] = await to(doAsync2(r1.xxx));
if(err2){
 // 错误处理
}
const [err3, r3] = await to(doAsync3(r2.xxx));
const [err4, r4] = await to(doAsync4(r3.xxx));
复制代码

代码又平整了。await-to-js 包装了 promise 的执行逻辑,将错误作为 promise 执行的结果返回,这种类似 Go 的错误处理方式,大大增加了后续操作的灵活性。

文章分类
前端
文章标签