你不可能差不多地将逐1promises都置于三个,你不可能简单地将逐条promises都放到一个

  怎么样通过选用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
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

  上面包车型大巴代码输出结果为一。很肯定,你不能够不难地将依次promises都放到七个Q()函数里来执行,那样只有第三个promise会被正确地实施,剩余的都会被忽略掉。

  上边的代码输出结果为1。很鲜明,你不能够简单地将各类promises都放到一个Q()函数里来执行,那样唯有第一个promise会被正确地实施,剩余的都会被忽略掉。

  你能够运用Q.all来代表下边的艺术,它们之间的重大差距是前者将每一个promise单独作为参数进行传递,而Q.all则吸收接纳三个数组,全数要并行处理的promise都放到数组中,而数组被视作一个独自的参数字传送入。

  你能够选择Q.all来代表上面的法子,它们之间的要害差异是前者将各样promise单独作为参数进行传递,而Q.all则收取八个数组,全数要并行处理的promise都置于数组中,而数组被用作2个独自的参数字传送入。

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]
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的重回值:

  下边的代码输出结果为[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
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的逐条也是一模1样的。

  除却,大家还足以将then替换成spread,让Q重临三个个独自的值而非数组。和重返数组结果的艺术相同,那种措施赶回结果的依次和扩散的数组中的promise的次第也是1致的。

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
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,大家什么样处理错误呢?

  那假如中间的二个或多个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
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了,它会立即回到1个rejected,而任何未形成的promises不会再继续执行。借使你想等待全体的promises都推行完后再明确再次回到结果,你应该采用allSettled

  假使传入的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!
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!

 

 

相关文章