javascript - 如何使用 Q 链接嵌套的 Promise?我无法让它们按正确的顺序运行

标签 javascript node.js asynchronous promise q

我希望能够将方法链接在一起,这些方法本身可能包含链接方法。

日志应为“第一、第二、第三”。然而,在实践中却出现了“第二、第三、第一”。

我知道这段代码有点多余,但我只是想了解promise/node 是如何执行的。我将如何编写基于 promise 的函数,它们本身可以链接在一起?

    user.increaseReadings(id)
      .then(function(val) { console.log("second",val); return user.findById(id); })
      .then(function(val) { console.log("third",val); res.json(val); });
  }

来自/models/user模块:

exports.findById = findById;
function findById(id)  {
  deferred = Q.defer();

  User.findById(id, function(err, doc) { 
    if (err) return deferred.reject(err);
    deferred.resolve(doc);
  });

  return deferred.promise;
}

exports.increaseReadings = increaseReadings;
function increaseReadings(id) {
  deferred = Q.defer();

  findById(id).then(function(doc) {     <-- here's the problem
    doc.readings++;
    doc.save(function(err, doc) { 
      console.log("first");
      if (err) return deferred.reject(err);
      deferred.resolve(doc);
    });
  });

  return deferred.promise;
}

最佳答案

您可以这样重写您的increaseReadings:

function increaseReadings(id) {
    return findById(id).then(function(doc) {
        console.log(doc);
        var deferred = Q.defer();
        doc.readings++;
        doc.save(function(err, doc) { 
            console.log("first");
            if (err) return deferred.reject(err);
            deferred.resolve(doc);
        });
        return deferred.promise;
    });
}

此代码与您编写的代码之间的重要区别在于,传递给“then”方法的匿名函数返回一个 promise 。

在大多数 Promise 实现中,如果您作为处理程序的结果返回 Promise,则链中的下一步将不会执行,直到您解决返回的 Promise。

关于javascript - 如何使用 Q 链接嵌套的 Promise?我无法让它们按正确的顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230245/

相关文章:

javascript - 通过 firebase 云消息从 Android 应用程序向 Web 应用程序发送通知

javascript - 为不同的浏览器加载不同的模板文件

android - 异步更新 ListFragment

node.js - process.nexttick 抛出错误 - mongoose 和 mongodb

node.js - 检查已安装的 angular-cli 版本?

javascript - 使用 JqueryAJAX 中的 ".then"到 "normal"函数?

javascript - 如何在 React 渲染函数中异步等待?

javascript - 从 URL 返回 innerHTML

javascript - 使用 Tinysort 按子属性对 HTML 列表进行排序

node.js - 无法正确读取 config.json(TypeScript、Webpack)