什么`x = x.then()`在承诺中做什么?

时间:2015-07-12 19:59:24

标签: javascript promise flow-control es6-promise

我试图理解一些有一种新颖的承诺方法的代码:

var sequence = Promise.resolve();

sequence = sequence.then(
    function() {
        // success function
    }
);

sequence = sequence.then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
);

sequence = sequence.then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
);

这与正常的链式.then方法有何不同?使用安全吗?

2 个答案:

答案 0 :(得分:7)

  

这与正常的链式.then方法有何不同?

完全没有。您可以删除sequence变量并直接链接.then()方法调用,并且您将从承诺中获得完全相同的行为。

  

使用安全吗?

  

我为什么要用它?

通常,你不应该。它(显然)只是令人困惑,不需要那个sequence变量,它只是更长。使用描述性名称创建变量可以使代码更加冗长和易于理解,但sequence只是毫无意义。

但是,有一个优点:您可以构建动态链。您可以在if块中放置一些这些赋值,甚至使用循环来构建可变长度和行为的promise链。通过在执行promise回调之前同步评估条件,与将所有控制流放在promise回调中相比,这甚至可能对性能有利(尽管在内存中创建了大量的promise对象)。无论如何,这种方法应该使用不同的描述性变量,而不是重复地重新分配给同一个变量。

答案 1 :(得分:1)

使用安全。它等同于链接,但显式重新赋值then函数返回的承诺。

换句话说,就像写的一样

sequence = sequence.then(
    function() {
        // success function
    }
).then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
).then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
);