执行一个中间动作,并在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);
};
假设你的例子callSomething
return是一个承诺
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
也没关系
是否有 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);
};
假设你的例子callSomething
return是一个承诺
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