`x = x.then()` 在 promises 中做了什么?

What does `x = x.then()` do in promises?

我正在尝试理解一些具有新颖承诺方法的代码:

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 方法有何不同? 使用安全吗?

可以放心使用。它等效于链接,但显式重新分配 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
    }
);

How does this differ from the normal chained .then approach?

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

Is it safe to use?

是的。

Why would I use it?

通常情况下,您不应该这样做。它(显然)只是令人困惑,不需要 sequence 变量,而且它更长。创建具有描述性名称的变量可以使代码更冗长和更容易理解,但是 sequence 只是没有意义。

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