2016-11-19 49 views
-2

我花了这么多时间试图找到这里这个问题的答案,并拿出什么利用数据。希望有人能开导我..的Javascript:从一个异步回调函数(MongoClient)

我有一个代码,它正在对数据库进行异步调用,并在回调函数中返回数据(在我的例子中,我使用的是MongoClient,它返回一个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和,而详尽的文件是在一定程度上是有用的,我,M在现实生活中实现,如实际使用此信息有问题上面的一个。因此,我的问题在这里。

+1

可能重复[如何从异步调用返回响应?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) – Andreas

+0

你连接的这个问题确实有你需要的所有信息。克林先生的回答有很多解释和针对不同情况的各种解决方案。 – Pointy

+0

你能告诉你如何使用Promise吗? – Victory

回答

0

异步调用发生,你是在调用堆栈之外。你无法将其返回到当前堆栈。

所以我们使用的承诺挂钩到结果我们的电话。

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); 
}); 
+0

欣赏努力,但这并不适合我。谢谢你把我拉到虽然解决许的想法,我好不容易才凑齐基于这种想法的解决方案:) – user2521119

+0

没问题。如果它有帮助,你应该upvote,如果你找到解决方案解释它,你可以在这里回答你自己的问题,它的鼓励。 – Victory

0

很长一段时间的实验,我终于成功地做到这一点后 - 我并不需要在最后任何花哨的回调或额外承诺,我只是删除的数据库请求可选的回调,而是处理返回的承诺分别。

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; 
}