【问题标题】:making mongoskin function is asynchronous sync使mongoskin函数异步同步
【发布时间】:2013-12-25 10:53:22
【问题描述】:
User.prototype.isUnique = function () {
    var result;
    db.user.count({name:'abcdefg'}, function(err, count){
        console.log('the count is: ' + count);
        result = count;
    });
    return result;
}

此函数用于判断此用户是否唯一,但返回结果始终为“未定义”,因为 db 操作是异步的。我相信这是nodejs中的一个常见问题。 我该如何解决?

我尝试使用 Promise (https://npmjs.org/package/promise),但我没有足够的知识来理解他们的文档。它适用于非常高级的开发人员。

你能帮我一些示例代码吗?我需要做的就是使用mongoskin获取count(),然后在这个成员方法中返回结果。

谢谢!

【问题讨论】:

  • 有没有可以使用的wait_for()函数?

标签: node.js mongoskin


【解决方案1】:

这不是一个常见的问题,它只是 Node 的工作方式,你必须习惯于处理。

最简单的解决方案(也是一种非常常见的解决方案)是从调用代码中提供一个回调函数。只要异步操作完成,就会调用该函数:

User.prototype.isUnique = function(callback) {
  db.user.count({name:'abcdefg'}, function(err, count){
    console.log('the count is: ' + count);
    callback(err, count);
  });
}

// in your calling code:
user.isUnique(function(err, count) {
  if (err) ...; // TODO: handle error
  ...
});

在 Node 中也很常见,如果发生错误,回调函数至少接受一个包含错误对象的参数,如果一切正常,则接受 null

在上面的代码中,我将调用db.user.count 期间可能发生的任何错误传递给回调函数。由调用代码来处理任何错误。

处理异步代码有多种选择。一种是使用承诺,就像你提到的那样。还有像streamline 这样的解决方案可以让异步代码看起来像同步的一样,但它要求你在使用之前“编译”你的代码(尽管这也可以在运行时完成) .

编辑:如果你想使用 Promise,你可以使用这个:

var Promise = require('promise');

User.prototype.isUnique = function() {
  return Promise(function(resolve, reject) {
    db.user.count({name:'abcdefg'}, function(err, count){
      if (err) {
        console.log('an error occurred:', err);
        reject(err);
      } else {
        console.log('the count is:', count);
        resolve(count);
      }
    });
  });
};

// in your calling code:
user.isUnique().then(function(count) {
  ...
}, function(err) {
  ...
});

(这需要安装promise 包)

【讨论】:

  • 非常感谢!让我试试回调方法。
  • 你知道如何使用promise来解决这个问题吗? (npmjs.org/package/promise)
  • @NicolasS.Xu 我添加了一个关于如何实现承诺的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 2012-07-25
  • 1970-01-01
  • 2019-03-24
  • 2021-09-23
  • 2013-07-12
相关资源
最近更新 更多