2016-05-31 51 views
1

我有一个回复承诺的电话。在这一刻,我这样做:如何在then()中传递bluebird回调参数?

Something(...) 
    .then(()=>{console.log("Done.");}); 

这将是更实际:

Something(...) 
    .then(console.log, "Done."); 

例如,setTimeout作品那样:

setTimeout(console.log, 1000, "Done."); 

确实蓝鸟有这方面的任何方法?我的目标是让这个实用的选项来减少Promise产生的已经很荒谬的代码量。

+0

不幸的是它的诺言/ A的一部分+标准,你可以在[MDN(HTTPS见上市:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then),并在[本网站](https://promisesaplus.com/)蓝鸟只是执行规则,你也必须有一个从promise/reject中返回的回调,这就是为什么它必须是一个函数,不管它是空的还是充满数据的。 - 特别是在这个公告[在这里](https://promisesaplus.com/#point-35) – Andrei

+1

编辑“不幸的是它是承诺/ A +标准的一部分”我会说**幸运**。 :)否则,每个实现都会有略微不同的突然多态性“减少代码的可笑数量等等等等等等等等” –

回答

1

在这一刻,我这样做:

Something(…).then(()=>{console.log("Done.");}); 

这是正确的做法。箭头功能已经缩短了很多。请注意,您可以删除“{”...“”;}“零件。

这将是更实际:

Something(…).then(console.log, "Done."); 

不,不会。 then的第二个参数是onRejected回调,而不是字符串。你不能那样做。

我的目标是减少 承诺产生的已经很荒谬的代码量。

然后用async/await语法和一个转译器。它是那样简单

await Something(…); 
console.log("Done"); 

确实蓝鸟有这方面的任何方法?

如果你不喜欢使用transpiler但在ES6环境(如最近的Node.js),你可以使用发电机的功能模仿async/awaitPromise.coroutine

1

该功能与setTimeout几乎相同。 IE9及以下版本需要使用polyfill https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

以下是使用console.log的示例案例的解决方法。谨慎使用任何引用this的函数。您可以使用bind来设置值this或保留undefined。此外,由于该值会自动作为bind的最后一个参数传递,因此它将在“完成”之后记录已解析的承诺值。

Something(...) 
    .then(console.log.bind(undefined, "Done.")); 
0

@Bergi对你的问题给出了很好的答案。我想补充,如果你使用() => console.log("Done.")或其他一些通用的回调很多,使它成为一个独立的功能:

function afterSomething() { 
    console.log("Done."); 
} 

Something(...) 
    .then(afterSomething);