promise与async-await

一. async/await 相对 promise 的优势

async/await 拥有更通用的作用域,使得代码有更好的易读性和可维护性。

promise 由于其链式调用,每一个函数都有自己的作用域,如果在多层链式调用的层级中,相隔两层的链需要有相互依赖关系,则需要额外的参数传递。

场景如下:

假设有 p1 、 p2 、 p3 三个异步操作函数, 并且返回的结果都是 promise。

若: p2 依赖于 p1 的结果。 p3 依赖于 p2 和 p1 的结果。采用 promise 链式的代码书写如下:

p1.then(r1 => Promise.all([r1, p2(r1)]))
  .then([r1,r2] => p3(r1, r2))

而用 async/await 的写法则比较明了:

let r1 = await p1();
let r2 = await p2(r1);
let r3 = await p3(r1,r2);
再来一个例子:

有4个返回值为promise的异步操作函数, p1、p2、p3、p4。

若:p3依赖 p2 的结果, p4 依赖 p1、p3 的结果。

采用 async/await 的写法如下:

let r1 = await p1();
let r2 = await p2();
let r3 = await p3(r2);
let r4 = await p4(r1,r3);

采用promise的写法如下:

Promise.all([p1,p2])
.then([r1,r2] => Promise.all([r1, p3(r2)]))
.then([r1,r3] => p4(r1,r3))

以上写法,promise 的优势在于p1 、p2 彼此无相关依赖,应该并行执行。 而 await 的写法没有做到 p1 、 p2 并行, 故可修改如下:

let r1 = p1();
let r2 = await p2();
let r3 = await p3(r2);
let r4 = await p4(await r1,r3);
posted @ 2019-03-20 16:41  peakleo  阅读(329)  评论(0编辑  收藏  举报