Hiyas。我有一个简单的应用程序,其中客户端期望作为结果的承诺,但在调用resolve()方法时,promise将继续返回undefined作为结果。
客户端代码:
UsersRepo.findOneAsync({id: id}).then(function(err, result) {
console.log("UserService promise resolution", err, result);
});
这输出" null"和" undefined",分别为err和result
正在完成工作并返回承诺的代码:
findOneAsync: function(args) {
var where = ""; //omitted
var promise = new Promise(function(resolve, reject) {
db.query("Select * from users" + where + " limit 1", function(err, result) {
var res = { id: 1, username: 'username', firstName: 'First', lastName: 'Last' };
if(err != null) {
console.log("REJECT", err);
reject(err);
}
else {
console.log("RESOLVE", res);
resolve(null, res);
}
});
});
return promise;
}
正如您所看到的,我只是为此测试返回了一些静态数据(' res'变量)。在客户端代码中,控制台语句始终打印出来:
UserService promise resolution null undefined
我不明白。看起来我正确地做了一切:用数据调用resolve()方法,并且客户端代码正确使用.then(函数(错误,结果)),所以看起来如此。为什么没有从客户端收到数据?
感谢您的帮助!
==>
解决方案:
如下所述,Bluebird的拒绝和解决只接受一个论点。第一个' null'才被人看见。将代码更改为“解析(res)'工作。谢谢你们。
答案 0 :(得分:7)
Resolve / Reject都接受一个参数...因此为什么你的结果是未定义的,因为你传递给resolve的第二个值永远不会被使用,第一个值是null
你要做的是
UsersRepo.findOneAsync({id: id}).then(function(result) {
console.log("UserService promise resolution", result);
}).catch(function(err) {
console.log("UserService promise error", err);
});
findOneAsync: function(args) {
var where = ""; //omitted
var promise = new Promise(function(resolve, reject) {
db.query("Select * from users" + where + " limit 1", function(err, result) {
var res = { id: 1, username: 'username', firstName: 'First', lastName: 'Last' };
if(err != null) {
console.log("REJECT", err);
reject(err);
}
else {
console.log("RESOLVE", res);
resolve(res);
}
});
});
return promise;
}
答案 1 :(得分:1)
蓝鸟then
不接受err
。相反,然后接受两个函数,第一个用于解析,第二个用于拒绝。您也可以使用catch
来处理错误。
http://bluebirdjs.com/docs/api/then.html
编辑:@JaromandaX是正确的,解析函数应该只接受一个参数。
除了不期望错误对象传递到resolve(res)
回调之外,您应该只then
。