【问题标题】:express js function with api not returning value用api表达js函数不返回值
【发布时间】:2015-08-15 05:56:35
【问题描述】:

我有一个快速应用程序,我在其中通过 API 调用调用函数。 我遇到的问题是从 API 调用中获取响应 函数并返回主路由器。我知道这可能必须做 代码被异步处理,但我不知道 解决问题的方法。

/* GET funnel page. */
router.get('/funnel', function(req, res, next) {
var score = 'test2';    
score = GetQuery('Bars');
  res.render('funnel', {title: score});
});

function GetQuery(query) {
  var test = 'test3';
  factual.get('/t/places-us', {q:query,limit: 1, filters:{"$and":[{"region":{"$eq":"NY"}},{"locality":"pittsford"}]}}, function (error, res) {
   test = res.data[0].email;
  });
return test;
}

【问题讨论】:

  • 异步,异步,异步。这是人们加快 node.js 开发速度的常见问题之一。 factual.get() 看起来像是一个异步函数。这意味着它会通过稍后调用回调来返回其值。因此GetQuery()test 的值被设置之前就已经返回了。因此,您不能从GetQuery() 返回值。您必须以异步兼容的方式返回结果,这意味着使用承诺或回调。

标签: javascript node.js api express


【解决方案1】:

你说得对,它确实与异步有关。问题是 API 调用不会阻塞,因此您无需重新分配值即可立即返回。解决这个问题的最简单方法是使用回调,即

/* GET funnel page. */
router.get('/funnel', function(req, res, next) {
  var score = 'test2';    
  GetQuery('Bars', function(err, score) {
    res.render('funnel', {title : score});
  });
});

function GetQuery(query, cb) {
  factual.get('/t/places-us', {q:query,limit: 1, filters:{"$and":[{"region":{"$eq":"NY"}},{"locality":"pittsford"}]}}, function (error, res) {
   cb(error, res.data[0].email);
  });
}

另一种选择是使用PromiseRxJS 之类的东西。这都可以让你为你的代码使用更流畅的风格:

承诺

/* GET funnel page. */
router.get('/funnel', function(req, res, next) {
  var score = 'test2';    
  GetQuery('Bars').then(function(score) {
    res.render('funnel', {title : score});
  });
});

var getQuery = Promise.denodify(factual.get);

function GetQuery(query) {
  return getQuery('/t/places-us', /*Query parameters*/).then(function (res) {
   return res.data[0].email;
  });
}

RxJS

/* GET funnel page. */
router.get('/funnel', function(req, res, next) {
  var score = 'test2';    
  GetQuery('Bars').subscribe(function(score) {
    res.render('funnel', {title : score});
  });
});

var getQuery = Rx.Observable.fromNodeCallback(factual.get, null, 
                             function(res) { 
                               return res.data[0].email; 
                             });

function GetQuery(query) {
  return getQuery('/t/places-us', /*Query*/);
}

【讨论】:

    【解决方案2】:

    使用回调

    GetQuery('Bars', function(err,result){
        res.render('funnel', {title: score});    
    });
    function GetQuery(query,callback) {
        var test = 'test3';
        factual.get('/t/places-us', {q:query,limit: 1, filters:{"$and":[{"region":{"$eq":"NY"}},{"locality":"pittsford"}]}}, function (error, res) {
            callback(error,es.data[0].email);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多