Bluebird promise resolve(data) 在客户端代码中未定义
Bluebird promise resolve(data) is undefined in client code
你好。我有一个简单的应用程序,客户期望得到一个 promise 结果,但是在调用 resolve() 方法时,promise 一直返回未定义的结果。
客户代码:
UsersRepo.findOneAsync({id: id}).then(function(err, result) {
console.log("UserService promise resolution", err, result);
});
这会输出 "null" 和 "undefined",分别表示错误和结果
执行工作并返回承诺的代码:
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(function(err, result)) ,看起来是这样。为什么收不到客户端的数据?
感谢您的帮助!
==>
解法:
如下所述,Bluebird 的 reject 和 resolve 只接受一个参数。第一个 'null' 只是被看到了。将代码更改为 'resolve(res)' 有效。谢谢大家。
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;
}
Bluebird 的 then
不接受 err
。相反, then 有两个功能,第一个是 resolve,第二个是 reject。您还可以使用 catch
来处理错误。
http://bluebirdjs.com/docs/api/then.html
编辑:是正确的,解析函数应该只接受一个参数。
除了不要期望错误对象被传递到 then
回调之外,您应该只 resolve(res)
。
你好。我有一个简单的应用程序,客户期望得到一个 promise 结果,但是在调用 resolve() 方法时,promise 一直返回未定义的结果。
客户代码:
UsersRepo.findOneAsync({id: id}).then(function(err, result) {
console.log("UserService promise resolution", err, result);
});
这会输出 "null" 和 "undefined",分别表示错误和结果
执行工作并返回承诺的代码:
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(function(err, result)) ,看起来是这样。为什么收不到客户端的数据?
感谢您的帮助!
==>
解法:
如下所述,Bluebird 的 reject 和 resolve 只接受一个参数。第一个 'null' 只是被看到了。将代码更改为 'resolve(res)' 有效。谢谢大家。
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;
}
Bluebird 的 then
不接受 err
。相反, then 有两个功能,第一个是 resolve,第二个是 reject。您还可以使用 catch
来处理错误。
http://bluebirdjs.com/docs/api/then.html
编辑:
除了不要期望错误对象被传递到 then
回调之外,您应该只 resolve(res)
。