我在嵌套回调中丢失了:
var getTweetsCloudant = function(key) {
db.find({
selector: {
name: 'john'
}
, fields: ['name', 'text']
, sort: []
, limit: 5
}, function (er, result) {
if (er) {
throw er;
}
return result;
});
}
console.log(getTweetsCloudant('something')); //--> undefined
这是我的代码的一部分,由于存在连接到Cloudantdb(db.find)的外部模块的依赖关系,因此我无法理解。 我的问题是console.log返回undefined而不是db.find回调的结果。 我明白我得到了未定义,因为回调(呃,结果)与getTweetsCloudant函数是异步的。我想创建一个由回调调用的函数(呃,结果),但整个事情变成了一个小怪物。
获取'结果'调用getTweetsCloudant的最佳方法是什么? (我的最终目标是将此功能导出为模块以供其他模块使用。)
干杯,乔瓦尼
答案 0 :(得分:2)
db.find
是一个异步函数。这意味着结果不会立即传递,并且呼叫是非阻塞的。结果仅适用于您传递给db.find
的回调。由于对db.find
的调用不会阻塞,函数将立即返回,而不是等待回调执行。
您可以使用类似的回拨方法来解决您的问题。
更改getTweetsCloundants以接受回调。
var getTweetsCloundants = function(key, next){
db.find({
selector: {
name: 'john'
}
, fields: ['name', 'text']
, sort: []
, limit: 5
}, function (er, result) {
if (er) {
next(er);
}
next(null, result);
});
}
您现在可以使用此功能,如下所示:
getTweetsCloudant('something', function(err, result){
if(err) { console.log(err) } else { console.log(result) }
})
还有其他方法可以处理异步内容。 Promises和async await。