使用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,如需转载请自行联系原作者


相关文章
|
3月前
|
前端开发 JavaScript
如何使用 Promise 处理异步并发操作?
通过使用 `Promise.all()` 和 `Promise.race()` 方法,可以灵活地处理各种异步并发操作,根据不同的业务需求选择合适的方法来提高代码的性能和效率,同时也使异步代码的逻辑更加清晰和易于维护。
|
3月前
|
JavaScript 前端开发 开发者
async/await和Generators在处理异步时有什么区别
总的来说,async/await 是在 Generators 的基础上发展而来的,它解决了 Generators 在处理异步时的一些不足之处,提供了更简洁、高效和易于理解的方式来处理异步操作。然而,Generators 在某些特定场景下仍然可能有其应用价值。
66 4
|
9月前
|
JavaScript Java Spring
@Async异步失效的9种场景
在Spring中,启用@Async异步功能需要在启动类或配置类上使用`@EnableAsync`。若未使用此注解,@Async将无效。另外,内部方法调用(如在一个类的方法中调用另一个被@Async注解的方法)会导致异步功能失效,因为这不涉及Spring的AOP代理。此外,@Async方法必须是public,返回类型为void或Future,不能是static或final,且其所在的类需被@Service等注解以使Spring管理。如果使用@ComponentScan,确保正确扫描包含@Async类的包路径。
127 1
|
4月前
|
前端开发 JavaScript
Async/Await 如何通过同步的方式(形式)实现异步
Async/Await 是一种在 JavaScript 中以同步方式书写异步代码的语法糖。它基于 Promise,使异步操作看起来更像顺序执行,简化了回调地狱,提高了代码可读性和维护性。
|
6月前
|
C#
C# async await 异步执行方法
C# async await 异步执行方法
68 0
|
9月前
|
监控 前端开发 JavaScript
async/await:使用同步的方式去写异步代码
async/await:使用同步的方式去写异步代码
135 1
|
9月前
|
缓存 Java Spring
@EventPublisher + @Async 异步事件流详解
本文主要介绍Spring事件流和`@Async`异步线程池处理,以及`@Async`默认线程池可能会导致的问题及解决方法。 在@Async注解中value参数使用自定义线程池,能让开发工程师更加明确线程池的运行规则,选取适合的线程策略,规避资源耗尽的风险
|
存储 前端开发 JavaScript
异步Promise及Async/Await 异步之神详解
异步Promise及Async/Await 异步之神详解
171 1
【一文读不懂C++】Function的应用
【一文读不懂C++】Function的应用
109 0
|
消息中间件 前端开发 JavaScript
ES8 中的 async/await —— 异步函数
ES8 中的 async/await —— 异步函数
213 0