2017-03-01 19 views
0

是否有一个能够获取Promise的值并将它推送到承诺链而不显式返回的速记?执行一个中间操作并将以前的结果保留在bluebird中

换句话说,有没有在青鸟以下的简写语法:

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

你必须,但短期和直列箭头功能我喜欢逗号操作符,比如'。那么(V =>返回它没关系(doSomething的(v),v))'。 – Redu

回答

1

如果你要经常使用这种模式,为什么不把一个普通的方法为它

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

比方说,你的榜样callSomething返回一个承诺

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,但在callSomething返回的承诺满足

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

但是,如果callsomething不返回无极

1

您可以使用箭头功能的体内Comma operator(不包括大括号):

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

的逗号运算符

评估它的每个操作数(从左到右)并返回最后一个操作数。

所以,result由表达式返回:

(callSomething(result), result) 

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

+0

'所以你总是在onFulfilled和onRejected回调函数中返回一个承诺的值,以便将值传递给链中'你的声明意味着'onFulfilled'必须返回一个承诺 - 至少这是我推断它的方式,我可能是单独在那个推论中。它是'.then'必须返回一个承诺,而不是它的回调 - 虽然他们**可以返回一个承诺,当然是 –

+0

你是对的@JaromandaX:它是'.then',*必须*返回一个承诺,而不是回调也可以返回简单的值。我从我的答案中删除了那部分内容,因为这是不正确的,而且不太恰当。谢谢。 – Andrea

相关问题