node.js Q Promise 然后是 Promise 链

标签 node.js promise q chaining

文档说 promise 链的工作原理如下

return getUsername()
  .then(function (username) {
     return getUser(username);
  })
  .then(function (user) {

如果下面的方法也能工作,那不是很好吗?

return getUsername()
  .then(getUser)
  .then(function (user) {

我偶然发现了它,因为这是我凭直觉所做的,但它不起作用。

非常感谢

最佳答案

是的,它有效。

它可能失败的原因有两个:变量 vs 函数提升或动态 this

提升和变量定义。

两者的区别:

var foo = bar;

还有:

var foo = function(x){ return bar(x); }

鉴于它的 bar 的签名是在第二个片段中 bar 被延迟评估。因此,如果 bar 未定义,您将在第一个示例中收到错误,但在第二个示例中不会收到错误。大多数 Promise 库都会忽略(并且由于规范而必须这样做)传递给 thenundefined 并简单地返回相同的 Promise。

您的示例中的此问题可能如下所示:

return getUsername()
  .then(function (username) {
     return getUser(username); // note it's a method
  })
  .then(function (user) { ...

// later on in the file after the function ended
var getUser = function(){
    // because of the function wrap above, this will work since 
    // the function(){ causes it to be lazily evaluated
};

另一方面做:

return getUsername()
  .then(getUser)
  .then(function (user) {

// later on in the file outside the function
var getUser = function(username){
       // code here
};

与执行相同:

return getUsername()
  .then(undefined) // remember, promises ignore this
  .then(function (user) {

这与 JavaScript 如何处理变量提升与函数声明托管有关。

动态此

它不起作用的原因是您的代码实际上看起来有点不同。您的代码更像是:

return getUsername()
  .then(function (username) {
     return someObj.getUser(username); // note it's a method
  })
  .then(function (user) {

事实上,getUser 正在访问其中的 this - 这使得 this 成为一个依赖于 this 的未绑定(bind)函数。请记住,JavaScript 具有动态 this,因此您不能简单地执行以下操作:

return getUsername()
  .then(someObj.getUser) // this won't work, pun intended
  .then(function (user) {

现在,为了使其工作 - 您可以绑定(bind)它,例如:

return getUsername()
  .then(someObj.getUser.bind(someObj) // IE9+
  .then(function (user) {

// if using bluebird, this is faster:
return getUsername().bind(someObj)
  .then(someObj.getUser) 
  .then(function (user) {

或者将较长的版本与函数表达式一起使用。

这可能不是您的具体问题 - 但十分之九的人问这个问题 - 它解决了他们的问题。

关于node.js Q Promise 然后是 Promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524443/

相关文章:

javascript - 向 MongoDB 插入数据并上传图片问题 enctype ="multipart/form-data"

node.js - 未知错误 : Chrome failed to start: exited abnormally when trying to test electron spectron with mocha

javascript - 错误 TS2307 : Cannot find module (external, 私有(private)模块)

javascript - 如何在 Node.js 中永远启动 cloudcmd 和 cordova 等应用程序

JavaScript Promises : chaining promises with non-promise objects. 为什么有效?

javascript - Promise.all 响应

javascript - 如何使用 Promise 循环异步调用

ember.js - 在 Ember 中,如何延迟准备,并将 AJAX 结果放入 Controller ?

javascript - nodejs Q.all promise 函数调用自身

用于在 promise 链上来回移动的 Javascript 模式