Javascript 如何在then()中传递bluebird回调的参数?
我接到一个回信的电话。此时此刻,我这样做:Javascript 如何在then()中传递bluebird回调的参数?,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我接到一个回信的电话。此时此刻,我这样做: Something( ... ) .then(()=>{console.log("Done.");}); Something(…).then(()=>{console.log("Done.");}); 这将更加实际: Something( ... ) .then(console.log, "Done."); Something(…).then(console.log, "Done."); 例如,setTimeout的工作原理
Something( ... )
.then(()=>{console.log("Done.");});
Something(…).then(()=>{console.log("Done.");});
这将更加实际:
Something( ... )
.then(console.log, "Done.");
Something(…).then(console.log, "Done.");
例如,setTimeout
的工作原理如下:
setTimeout(console.log, 1000, "Done.");
蓝鸟有什么办法吗?我的目标是使用这个实用的选项来减少承诺生成的已经荒谬的代码量
此时此刻,我这样做:
Something( ... )
.then(()=>{console.log("Done.");});
Something(…).then(()=>{console.log("Done.");});
这是正确的做法。箭头函数已经大大缩短了这一时间。请注意,您可以删除“{
”…“;}
”部分
这将更加实际:
Something( ... )
.then(console.log, "Done.");
Something(…).then(console.log, "Done.");
不,不会的。then
的第二个参数是onRejected
回调,而不是字符串。你不能那样做
我的目标是减少已经荒谬的代码量
承诺会产生影响
然后使用async
/wait
语法和transpiler。这很简单
await Something(…);
console.log("Done");
蓝鸟有什么办法吗
如果您不喜欢使用transpiler,但处于ES6环境中(如最近的Node.js),则可以使用生成器函数模拟
异步
/等待
。该功能是设置超时
的专有功能。IE9及以下版本无论如何都需要polyfill
下面是使用console.log
的示例案例的解决方法。在使用任何引用此的函数时都要小心。您可以使用bind
来设置this
的值,或者将其保留为未定义的值。此外,由于值作为最后一个参数自动传递给bind
,因此它将在“完成”之后记录承诺的解析值
Something( ... )
.then(console.log.bind(undefined, "Done."));
@Bergi对你的问题给出了很好的回答。要补充的是,如果您经常使用console.log(“完成”)
或其他一些常规回调函数,请将其作为一个单独的函数:
function afterSomething() {
console.log("Done.");
}
Something( ... )
.then(afterSomething);
不幸的是,它是promise/A+标准的一部分,正如你在和bluebird上看到的那样,它只是强制执行规则,而且你必须从promise resolve/reject返回一个回调,这就是为什么它必须是一个函数,无论它是非空的还是充满数据的--特别编辑本公告“不幸的是,这是承诺/A+标准的一部分”,幸运的是:否则,每一个实现都会有稍微不同的突如其来的“减少荒谬的代码量”