2017-02-20 39 views
0

使用猫鼬和Q作为promise。但结果是空{}Node.JS带Q promise的猫鼬请求返回空{}

var Q = require("q"); 

var deferred = Q.defer(); 

User.find({}, function (err, users) { 
    if (err) { 
     deferred.reject(next(err)); 
    } else { 
     deferred.resolve(users); 
    } 
}); 

return deferred.promise; 

与猫鼬承诺返回正确的数据相同的请求,但奇怪的顺序完成:

console.log("Label 1"); 
console.log("Label 2 Users = " + getUsers()); 
console.log("Label 3"); 

... 

getUsers = function(next) { 
    User.find({}).exec(). 
     .then(function (err, users) {(
      if (users) { 
       console.log("Label 4 Users = " + JSON.stringify(users)); 
       return user; 
      } 
     )} 
     .catch(err) { 
      return next(err); 
     }); 
} 

结果:

标签1 - >标签2 - >用户=未定义 - >标签3 - >标签4用户= {...}

Node.Js v7.5;猫鼬v4.8.3; q v1.4.1

哪里出错?我可以用什么方式在函数中调用猫鼬?

+0

哪里是你的回调?我看到的只是下一个(错误)。另外,为什么不首先使用承诺建立猫鼬? –

回答

0

似乎你没抓住异步执行的概念。 “异步”意味着结果不可用。您需要从您的函数返回的承诺(和解决您的错字):

getUsers = function(next) { 
    // v---- here 
    return User.find({}).exec(). 
     .then(function (err, users) {(
      if (users) { 
       console.log("Label 4 Users = " + JSON.stringify(users)); 
       return users; 
      } 
     )} 
     .catch(err) { 
      return next(err); 
     }); 
} 

然后等待它:

getUsers().then(function (users) { 
    console.log("Label 1"); 
    console.log("Label 2 Users = " + users); 
    console.log("Label 3"); 
}); 
1

如果你使用的猫鼬v4.8.3你不需要任何q多,使用猫鼬承诺直接

User.find({}) 
    .then((user) => { 
     console.log(users); 
    }) 
    .catch((err) => { 
     console.error(err); 
    });