2017-09-25 45 views
0

我读书用fs.readFileSync并获得每个文档,我正在使用的客户休息API调用JSON文件添加检索响应作为元素。员额。一旦我得到响应,我想将接收到的内容放入另一个JSON文件,该文件是输入JSON的副本,除了从client.post调用接收的数据之外的附加元素。不过可能是因为client.post的异步性质,我无法添加元素来输出JSON。我是NodeJS的新手。你能帮我找我失踪的地方吗?下面是代码和数据阅读的NodeJS文件,使节点休息客户端调用来获取相关的数据和JSON

数据:

[ 
    { 
     "ticker": "CLYD" 
    }, 
    { 
     "ticker": "EGH" 
    } 
] 

代码:

var fs = require('fs'); 
var Client = require('node-rest-client').Client; 

var data = fs.readFileSync(__dirname + "/data/stocks.json", "utf8"); 
processData(data); 

function processData (data) { 

    var obj = JSON.parse(data); 

    for (j = 0; j < obj.length; j++) { 

     obj[j].stockInformation = getValuesForTicker (obj[j].ticker.trim()); 

    } 

    var jsonOutput = JSON.stringify(obj,null,'\t'); 
    fs.writeFileSync(__dirname + "/data/response.json", jsonOutput); 

}; 

function getValuesForTicker (ticker) { 

    /** 
    * More details and samples at https://www.npmjs.com/package/node-rest-client 
    */ 
    var client = new Client(); 
    var values; 

    // set content-type header and data as json in args parameter 
    var args = { 
     data: { "ticker" : ticker}, 
     headers: { "Content-Type": "application/json", "Accept" : "application/json" } 
    }; 

    var responseToRequest = client.post("https://url.providing.response.as.json.content/", args, function (data, response) { 
//   parsed response body as js object 
     values = JSON.parse(JSON.stringify(data)).price; 
    }); 
    return values; 

}; 

回答

0

由于getValueForTicker使得异步调用来获取数据应该调用回调一旦数据被收到(或更好的承诺)并且不返回结果(当前undefined作为在赋值之前返回的值而返回)

function getValuesForTicker (ticker, callback) { 

    /** 
    * More details and samples at https://www.npmjs.com/package/node-rest-client 
    */ 
    return new Promise(function(resolve, reject) { 

      var client = new Client(); 
      var values; 

      // set content-type header and data as json in args parameter 
      var args = { 
       data: { "ticker" : ticker}, 
       headers: { "Content-Type": "application/json", "Accept" : "application/json" } 
      }; 

      var responseToRequest = 
      client.post("https://url.providing.response.as.json.content/", args, function (data, response) { 
     //   parsed response body as js object 
      values = JSON.parse(JSON.stringify(data)).price; 
      resolve(values) 
     }); 

    }; 
}) 

,并获得一次数据异步调用完成后,您将需要再调用函数如下:

 getValuesForTicker(obj[j].ticker.trim()) 
     .then(function(val) { 
      obj[j].stockInformation = val 
     }) 

考虑到你是新来的Node.js这将是很难get.Take一些时间来了解回调和承诺第一。

+0

谢谢你Minkesh。我试过你给出的代码,但不能使用'obj [j] .stockInformation = val'部分代码。我认为对于一个异步调用,obj [j]超出范围。我试图找出一个办法,我可以设置返回值回OBJ [J] – user1998463

+0

事实上,for循环不等待的承诺,以解决(或者换句话说,异步调用来完成)。你可以使用'async'库来获得想要的结果。 https://github.com/caolan/async。更具体地说,你将不得不使用'async.each'方法。你也可以通过使用'Promise.all'来实现它。 –

相关问题