返回

异步风格:避免链式Promise的最佳方式

前端

好的,让我们开始吧!

在现代的JavaScript生态圈中,异步风格的掌握是全栈开发人员必备的技能。Promise是JavaScript中的一个异步计算模型,用于处理非阻塞IO操作。 它为我们提供了处理异步操作的一套标准规范,为我们提供了一个统一的接口,无论底层是如何实现的。但人们常说,凡事有好的一面也有不好的一面。Promise也不列外,虽然它解决了回调函数层层嵌套的问题,但在使用它的时候需要注意以下几点。

“回调地狱”无法避免

Promise的出现很大程度上缓和了回调函数嵌套的问题,但是没有从根本上解决“回调地狱”,比如我们发送一个Ajax请求去服务器获取资源,也许通过这个资源我们还能获取其他资源,然后对这些资源进行一系列处理,完成目标。最终你的代码会像一棵树一样,从根节点开始不断地往下扩张,以这种方式编写异步代码,调试和维护的成本非常高。

链式调用不符合异步的执行逻辑

链式Promise的出现虽然解决了很多问题,但是也引入了新的问题。比如当我们执行一个操作的时候,如果想要执行多个操作,一般会使用这种形式的代码:

promise.then((res) => {
  // do something with res
}).then((res) => {
  // do something with res
}).then((res) => {
  // do something with res
});

假如上面这三个操作的执行顺序是:3 - 1 - 2,你就会发现这非常违背我们JavaScript的执行顺序,换句话说,链式Promise没有体现出异步非阻塞的特点,反倒像是强行串行执行了,这就违背了Promise的设计初衷。并且这种代码的可读性也会下降。

最理想的异步风格是什么样的?

显而易见,对于我们来说,最好的异步风格是不需要回调函数的,也没有嵌套,并且可读性高的。像Go语言的风格就是一个非常棒的借鉴,比如我们可以先用Promise.all([promise1, promise2, ...])将所有异步任务全部发送出去,等它们返回之后我们再对它们做统一处理,达到并发处理的目的,这远比使用.then(res => {...}).then(res => {...})清晰,也容易控制并发。

如果你想了解更多关于异步风格的信息,可以参考一下这些资源:

希望这些能帮助您更好地理解异步风格。