node - 在嵌套回调和范围中丢失

时间:2018-03-13 07:04:08

标签: node.js callback

我在嵌套回调中丢失了:

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的最佳方法是什么? (我的最终目标是将此功能导出为模块以供其他模块使用。)

干杯,乔瓦尼

1 个答案:

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

还有其他方法可以处理异步内容。 Promisesasync await