我花了很多时间试图在这里找到答案并且没有任何结果。希望有人可以启发我..
我的代码是对数据库进行异步调用并在回调函数中返回数据(在我的情况下,我使用MongoClient返回Promise)。但是,我无法弄清楚如何使用结果数据来实际设置函数级变量 - 每当我尝试这样做时,我记录的结果值是未定义的或未决的Promise对象。
关于这个主题有很多帖子,但是当我尝试应用它们时,我找不到任何有用的方法。感谢所有的帮助!
function lookupOneDbEntry(key, value) {
var responseData = "initial data"
// search for the entry in the database
db.collection("my_collection").findOne({key: value}, function(err, result) {
if (err) {
//if database throws an error
responseData = "db error";
}
else {
// if the entry is found, return the data
responseData = result;
}
});
return responseData;
}
编辑:我知道其他帖子(就像这个here一样,虽然详尽的文档在某种程度上是有用的,但我在实际的实现中很难使用这些信息,例如一个在上面。因此我的问题在这里。
答案 0 :(得分:0)
异步调用发生在您所在的调用堆栈之外。你不能把它归还当前的堆栈。
所以我们使用promises来勾勒我们的调用结果。
function lookupOneDbEntry(key, value) {
return new Promise(function (resolve, reject) {
// search for the entry in the database
db.collection("my_collection").findOne({key: value}, function(err, result) {
if (err) {
//if database throws an error
reject(err);
}
else {
// if the entry is found, return the data
resolve(result);
}
});
});
}
lockupOneDbEntry('myKey', 'myValue').then(function (result) {
console.log('result', result);
}, function (err) {
console.log("error!", err);
});
答案 1 :(得分:0)
经过一段时间的实验,我终于设法做到了 - 我最后不需要任何花哨的回调或额外的Promise,我只是删除了数据库请求中的可选回调而是处理了退还的承诺。
function lookupOneDbEntry(key, value) {
var responseData = "initial data";
var solution = db.collection("accounting_module").findOne({key: value});
solution.then(function (result) {
// validation of result here
responseData = result;
});
return responseData;
}