执行一个中间动作,并在bluebird中结转之前的结果

Perform an intermediate action and carry over the previous result in bluebird

是否有 shorthand 允许获取 Promise 的值并将其推向 Promise 链而不显式返回它?

换句话说,bluebird 中是否有以下 shorthand 语法:

.then(result => { callSomething(result); return result })

您可以在箭头函数的主体内使用 Comma operator(不带花括号):

.then(result => (callSomething(result), result)

逗号运算符

evaluates each of its operands (from left to right) and returns the value of the last operand.

因此,result 由表达式返回:

(callSomething(result), result)

然后,不带花括号的箭头函数,returns将表达式的值指定为它的主体。因此,返回 result

如果你打算经常使用这个模式,为什么不为它制作一个通用方法

Promise.prototype.skip = function skip(fn, onRejected) {
    return this.then(value => Promise.resolve(fn(value)).then(() => value), onRejected);
};

假设你的例子callSomethingreturn是一个承诺

function callSomething(v) {
    console.log('skip got', v);
    // this promise will be waited for, but the value will be ignored
    return new Promise(resolve => setTimeout(resolve, 2000, 'wilma'));
}

现在,b 使用 skip,而不是 then,传入的已完成值,在本例中为 fred,将只传递以下 then,但是returncallSomething 的承诺实现后

Promise.resolve('fred').skip(callSomething).then(console.log); // outputs "fred"

但是,如果 callsomething 不是 return Promise

也没关系