承诺链 - 参考与当时

时间:2017-06-15 07:54:38

标签: javascript es6-promise

基本问题,但这2个片段之间有区别吗?

function test() {
    var p2 = new Promise(function(resolve, reject) {
        resolve(1);
    });

    p2 = p2.then(function(value) {
        return new Promise(x=>{
            window.setTimeout(()=>{
                console.log("P finished");
                x();}, 100);
        });
    });
    if (condition) {
        p2 = p2.then(function(value) {
            return Promise.resolve(12);
        });
    }
    p2 = p2.then(function(value) {
        return new Promise(x=>{
            window.setTimeout(()=>{
                console.log("P3 finished");
                x();
            }, 1000);
        });
    });

    return p2;
}

function test() {
    var p2 = new Promise(function(resolve, reject) {
        resolve(1);
    });

    p2.then(function(value) {
        return new Promise(x=>{
            window.setTimeout(()=>{
                console.log("P finished");
                x();}, 100);
        });
    });
    if (condition) {
        p2.then(function(value) {
            return Promise.resolve(12);
        });
    }
    p2.then(function(value) {
        return new Promise(x=>{
            window.setTimeout(()=>{
                console.log("P3 finished");
                x();
            }, 1000);
        });
    });

    return p2;
}

点用例是我有一些基于我构成整个承诺链的条件(每个承诺可能在此过程中被拒绝)所以我想知道这两种方式是否相同?我个人认为#1是正确的,但我更喜欢#2更简洁的语法。

1 个答案:

答案 0 :(得分:1)

存在根本区别,因为在第二种情况中,您返回的最终承诺p2将始终只返回值2,而不会与其余代码链接它也会运行,但不会以任何方式影响返回的p2解决的值。

一个简单的例子就是:

var p = new Promise(res => res(1));
p = p.then(() => new Promise(res => res(2)));
p = p.then(() => new Promise(res => res(3)));

p.then(v => console.log(v));

var p2 = new Promise(res => res(1));
p2.then(() => new Promise(res => res(2)));
p2.then(() => new Promise(res => res(3)));

p2.then(v => console.log(v));

在第一种情况下,会打印3,但在第二种情况下会打印1

所以正确的版本是第一个

你可以用来使它更具可读性并避免p变异的模式是使用带过滤器的promises数组并减少:

var promises = [
     new Promise(res => res(1)),
     new Promise(res => res(2)),
     condition ? new Promise(res => res(3)) : null];

return promises
    .filter(p => !!p) // discards nulls from promises not passing condition
    .reduce((finalP, p) => finalP.then(p), Promise.resolve()); // effectively chains all promises

这将链条和条件与承诺的实际定义分开。