Javascript:利用来自异步回调函数的数据(MongoClient)

时间:2016-11-19 13:36:38

标签: javascript mongodb callback

我花了很多时间试图在这里找到答案并且没有任何结果。希望有人可以启发我..

我的代码是对数据库进行异步调用并在回调函数中返回数据(在我的情况下,我使用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一样,虽然详尽的文档在某种程度上是有用的,但我在实际的实现中很难使用这些信息,例如一个在上面。因此我的问题在这里。

2 个答案:

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