我目前正在学习蓝鸟,并想出了一些代码(使用Express.js和Mongoose)来测试它:
let startServer = Promise.promisify(app.listen, app);
let connectDB = Promise.promisify(mongoose.connect, mongoose);
startServer(3000)
.then(() => connectDB(MongoURI))
.catch((e) => {
console.log('Exception ' + e);
});
我的第一个.then调用中的函数只返回另一个函数。 因此我想知道,如果有办法将connectDB直接传递给.then并使其工作。像这样:
startServer(3000)
.then(connectDB, MongoURI)
.catch((e) => {
console.log('Exception ' + e);
});
答案 0 :(得分:3)
因此我想知道,如果有办法将connectDB直接传递给.then并使其工作。
是的,这可以通过名为 currying 的东西来实现(在数学家Haskell Curry之后)。您还会看到它名为部分应用程序。基本上,您创建一个新函数,在调用时,将使用您在创建时指定的参数调用原始函数。
JavaScript有Function#bind
,它有两件事:1。设置this
将是什么,以及2.做什么。看起来您的示例并不关心this
将会是什么,所以我们可以将它用于此。
例如:
startServer(3000)
.then(connectDB.bind(null, MongoURI))
.catch((e) => {
console.log('Exception ' + e);
});
null
用于thisArg
参数,我们实际上没有使用它。
这是一个更简单的例子,仅用于说明:
function foo(a, b) {
snippet.log("a = " + a);
snippet.log("b = " + b);
}
// "Curry" 1 as the first arg
var f1 = foo.bind(null, 1);
// Call the resulting function:
f1(2); // "a = 1, b = 2"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
是否欲望是另一个问题(可能是基于意见的问题)。带箭头功能的原件很好而且清晰,不太昂贵(在内存或时间方面)。但是可能去做,是的。
如果你希望函数接收它被调用的this
(可能不是你的情况,但它在基于浏览器的JavaScript中的jQuery事件处理程序中很常见),它也很容易编写一个只在没有this
东西Function#bind
的情况下进行干扰的函数。 This answer有一个非常简单,未经优化的例子。