数据未添加到匿名函数内的JSON对象

时间:2016-08-17 19:25:39

标签: javascript json node.js express cheerio

当使用express方法res.json(items_json)返回JSON对象items_json时,我遇到了一个问题。当在下面的代码中在POSITION#1处调用express方法res.json(items_json)时,该函数完美地工作。但是,当在POSITION#2而不是#1调用res.json(items_json)时,返回的JSON对象为空:

{
  "example_key_object": []
}

我想在POSITION#2中有res.json(items_json),所以我可以添加一个循环。为什么在位置#2时JSON响应为空,但在位置#1时工作正常? (以下代码的上下文:res.json(items_json)永远不会同时位于#1&#2)

app.get('/example_apiurl', function(req, res) {

   var items_json = {}
   var key_object = 'example_key_object';
   items_json[example_key_object] = [];

   var item_str; 
   var data;      
   var url = "example.com";

     request(url, function(error, response, html){
        if(!error){
          var $ = cheerio.load(html);

          /*
            some irreverent logic to get var items_clean_st
          */

          item_str = items_clean_st.substring(x,y);
          data = {
            locationID: 2,
            item: item_str
          };
          items_json[key_object].push(data);
          res.json(items_json) //POSITION #1 //returns correctly!
        }
     })
   res.json(items_json) //POSITION #2 //empty :(
  }
})

1 个答案:

答案 0 :(得分:0)

您将匿名函数作为参数传递给另一个名为request的函数。我不确切知道这个匿名函数会发生什么,但是我猜测它是在将来响应某些浏览器事件时调用的,例如AJAX请求完成。

因此,位置#2的呼叫很可能发生在POSITION#1的呼叫之前。