2017-09-25 44 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'來實現它。 –

相關問題