2013-12-08 116 views
0
User.prototype.isUnique = function() { 
    var result; 
    db.user.count({name:'abcdefg'}, function(err, count){ 
     console.log('the count is: ' + count); 
     result = count; 
    }); 
    return result; 
} 

该函数用于查明该用户是否唯一,但返回结果总是'undefined',因为db操作是异步的。我相信这是nodejs中的一个常见问题。 我该如何解决它?使mongoskin函数是异步同步

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

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

谢谢!

+0

是否有任何wait_for()函数,我可以使用? –

回答

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

这也是常见的节点有回调函数接受至少一个参数,它包含一个错误对象,如果发生错误,或者null如果一切正常。

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

处理异步代码有几种选择。就像你提到的那样,其中一个就是使用承诺。还有像streamline这样的解决方案,它使异步代码看起来像一样,但它需要您“编译”您的代码(尽管这也可以在运行时完成),然后才能使用它。

编辑:,如果你想使用的承诺,您可以使用此:

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包安装)

+0

非常感谢!让我试试回调方法。 –

+0

你知道如何使用诺言来解决这个问题吗? (https://npmjs.org/package/promise) –

+0

@ NicolasS.Xu我添加了一个关于如何实现promise的例子。 – robertklep