使用" .then"链接蓝鸟中的异步函数。什么是最好的方法?

时间:2015-10-14 13:00:58

标签: javascript node.js bluebird

我目前正在学习蓝鸟,并想出了一些代码(使用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);
  });

1 个答案:

答案 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有一个非常简单,未经优化的例子。