使用Q进行同步的Promises操作

简介:

如何通过使用Q来并发执行多个promises呢?

复制代码
Q(Q(1), Q(2), Q(3))
    .then(function (one, two, three) { 
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (ex) {
        console.error(ex.stack);
    });
// 1
复制代码

  上面的代码输出结果为1。很显然,你不能简单地将各个promises都放到一个Q()函数里来执行,这样只有第一个promise会被正确地执行,剩余的都会被忽略掉。

  你可以使用Q.all来代替上面的方法,它们之间的主要区别是前者将每个promise单独作为参数进行传递,而Q.all则接收一个数组,所有要并行处理的promise都放到数组中,而数组被作为一个独立的参数传入。

复制代码
Q.all([Q(1), Q(2), Q(3)])
    .then(function (one, two, three) {
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (ex) {
        console.error(ex.stack);
    });
// [1,2,3]
复制代码

  上面的代码输出结果为[1, 2, 3]。所有的promises都被正确执行,但是你发现Q.all返回的结果依然是一个数组。我们也可以通过下面这种方式来获取promises的返回值:

复制代码
Q.all([Q(1), Q(2), Q(3)])
    .then(function (one, two, three) {
        console.log(one[0]);
        console.log(one[1]);
        console.log(one[2]);
    }, function (ex) {
        console.error(ex.stack);
    });
// 1
// 2
// 3
复制代码

  除此之外,我们还可以将then替换成spread,让Q返回一个个独立的值而非数组。和返回数组结果的方式相同,这种方式返回结果的顺序和传入的数组中的promise的顺序也是一致的。

复制代码
Q.all([Q(1), Q(2), Q(3)])
    .spread(function (one, two, three) {
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (ex) {
        console.error(ex.stack);
    });
// 1
// 2
// 3
复制代码

  那如果其中的一个或多个promsie执行失败,被rejected或者throw error,我们如何处理错误呢?

复制代码
Q.all([Q(1), Q.reject('rejected!'), Q.reject('fail!')])
    .spread(function (one, two, three) {
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (reason, otherReason) {
        console.log(reason);
        console.log(otherReason);
    });
// rejected!
// undefined
复制代码

  如果传入的promises中有一个被rejected了,它会立即返回一个rejected,而其它未完成的promises不会再继续执行。如果你想等待所有的promises都执行完后再确定返回结果,你应当使用allSettled

复制代码
Q.allSettled([Q(1), Q.reject('rejected!'), Q.reject('fail!')])
.then(function (results) {
    results.forEach(function (result) {
        if (result.state === "fulfilled") {
            console.log(result.value);
        } else {
            console.log(result.reason);
        }
    });
});
// 1
// rejected!
// fail!
复制代码

 


本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/p/7816345.html,如需转载请自行联系原作者


相关文章
|
5月前
|
编译器 数据处理 C#
C#中的异步流:使用IAsyncEnumerable<T>和await foreach实现异步数据迭代
【1月更文挑战第10天】本文介绍了C#中异步流的概念,并通过使用IAsyncEnumerable<T>接口和await foreach语句,详细阐述了如何异步地迭代数据流。异步流为处理大量数据或需要流式处理数据的场景提供了一种高效且非阻塞性的方法,使得开发者能够更优雅地处理并发和数据流问题。
|
12月前
|
前端开发
10 # promise2 状态的处理
10 # promise2 状态的处理
48 0
|
5月前
|
前端开发
Await和Async是什么?跟Promise有什么区别 使用它有什么好处
Await和Async是什么?跟Promise有什么区别 使用它有什么好处
|
2月前
|
C#
C# async await 异步执行方法
C# async await 异步执行方法
41 0
|
4月前
|
前端开发
|
5月前
|
监控 前端开发 JavaScript
async/await:使用同步的方式去写异步代码
async/await:使用同步的方式去写异步代码
83 1
|
Web App开发 前端开发 JavaScript
关于 Await、Promise 执行顺序差异问题
关于 Await、Promise 执行顺序差异问题
292 0
关于 Await、Promise 执行顺序差异问题
|
前端开发
forEach 如果传入异步回调如何保证并行执行?
forEach 本身是同步的,但是如果回调函数是异步的,那么forEach 会立即执行下一个任务,而不会等待回调函数执行完毕,这个时候如何保证异步任务的串行执行呢?
179 0
|
小程序 安全 数据库
小程序里使用async和await变异步为同步,解决回调地狱问题
小程序里使用async和await变异步为同步,解决回调地狱问题
160 0
|
前端开发 JavaScript
setState()异步 同步
setState()异步 同步