Javascript 如何在返回新承诺的函数中使用另一个承诺?

Javascript 如何在返回新承诺的函数中使用另一个承诺?,javascript,node.js,promise,Javascript,Node.js,Promise,我开始学习JS中的承诺,并尝试使用承诺替换现有的回调逻辑。我编写了一个函数,它返回一个新的承诺,并使用数据库实例的承诺来检索数据。然而,我不确定我是否做对了。下面是代码片段 usersService.js var getUsers = function(queryObject) { return new Promise(function(resolve, reject) { dbConnection.find(queryObject) .then(fu

我开始学习JS中的承诺,并尝试使用承诺替换现有的回调逻辑。我编写了一个函数,它返回一个新的承诺,并使用数据库实例的承诺来检索数据。然而,我不确定我是否做对了。下面是代码片段

usersService.js

var getUsers = function(queryObject) {
    return new Promise(function(resolve, reject) {
        dbConnection.find(queryObject)
          .then(function(result) {
              if (result.length > 0) {
                resolve(result)
              } else {
                resolve(errorMessage.invalidUser())
              }).catch(function(err) {
              reject(err)
            });
          })
    };
router.get('/users', function (req,res,next) {
     var queryObject = { "userId":req.query.userId };
     userService.getUsers(queryObject)
          .then(function (data) { //some logic })
          .catch(function (err) { //some logic });
});
usersRouter.js

var getUsers = function(queryObject) {
    return new Promise(function(resolve, reject) {
        dbConnection.find(queryObject)
          .then(function(result) {
              if (result.length > 0) {
                resolve(result)
              } else {
                resolve(errorMessage.invalidUser())
              }).catch(function(err) {
              reject(err)
            });
          })
    };
router.get('/users', function (req,res,next) {
     var queryObject = { "userId":req.query.userId };
     userService.getUsers(queryObject)
          .then(function (data) { //some logic })
          .catch(function (err) { //some logic });
});
  • 我可以有条件地使用
    解析
  • 如果答案是否定的,那么正确的方法是什么
  • 另外,我是否在路由器中以正确的方式使用承诺

  • 提前谢谢

    因为dbConnection.find返回一个承诺,所以您可以直接返回它,并选择在解析它时传递什么。没有必要把它包装在另一个承诺里

    var getUsers = function (queryObject) {
        return dbConnection.find(queryObject).then(function (result) {
           if (result.length > 0) {
              return result
           } else {
              return errorMessage.invalidUser()
           }
        })
    };
    

    您有一个输入错误:
    resovle(result)
    @melpomeneeditEdit的
    解析(errorMessage.invalidUser())
    有点出乎意料。您可能想
    拒绝(errorMessage.invalidUser())
    。如果我在与db交谈时遇到任何异常,该怎么办?我的意思是,如何利用(dbConnection的)catch块?我是否需要在catch块中编写另一个return语句,然后检查返回值是否是路由器中的实例或错误?对我来说,最好在最后捕获错误,但我想这取决于您想要完成什么。你已经准备好捕捉路由器中的错误了,所以这很好。在else条件中的错误是因为不正确的用户ID,其中搜索结果的数量为零。我问的是dbConnection promise本身引发的错误。如果dbConnection.find引发错误,您将在
    userService.getUsers(queryObject.catch)(函数(err){//some logic})中收到错误承诺是可链接的,因此您将在catch中收到所有错误,无需多次捕获。谢谢@Gatsbill。我将继续这样做并进行测试!