2017-07-18 116 views
0

我已經經歷了關於從節點JS請求調用返回數據的問題。一個常見的錯誤是假設語句是一行一行地執行還是同步執行,但這裏並不是這種情況。這種類型的問題:How to get data out of a Node.js http get requestNode.js請求函數返回數據

我的問題有點不同。我寫了一個函數getNumber(),它返回給定查詢的結果數量。我想知道如何返回回調函數檢索到的值?因此,例如:

function getNumResults() { 

Request(url, function(response) { 

    var responseJSON = JSON.parse(body); 
    return(responseJSON.results.count); 

    }); 

}

function Request(URL, callback) { 

request(URL, function(error, response, body) { 

    console.log('URL: ', URL); 
    console.log('error: ', error); 
    console.log('statusCode: ', response && response.statusCode); 
    console.log('body: ', body); 
    callback(body); 
}); 

}

如果我想getNumResults()返回responseJSON.results.count?我怎麼能這樣做?

回答

2

如果我想getNumResults()返回responseJSON.results.count會怎麼樣?我怎麼能這樣做?

您不能直接從getNumResults()返回異步值。你不能。該函數在該值甚至可用之前很久就返回。這是時間問題。這就是異步響應的工作原理。他們將來會完成一些不確定的時間,但它們是非阻塞的,所以其餘的Javascript繼續運行,因此函數在結果甚至可用之前返回。

獲得結果的唯一方法是使用某種回調。這適用於您的Request()功能和我們的getNumResults()功能。一旦結果是異步的,調用鏈中的任何人都不能逃脫。異步是有傳染性的,你永遠不能從異步回到同步。因此,如果您的getNumResults()想要將值返回給調用者,它將不得不自己接受回調,並在獲取該值時調用該回調,否則它將不得不返回一個與該值一起解決的承諾。

這裏是你如何能做到這一點使用的承諾(這是異步的發展在Javascript未來):

// load a version of the request library that returns promise instead of 
// taking plain callbacks 
const rp = require('request-promise'); 

function getNumResults(url) { 
    // returns a promise 
    return rp(url).then(body => { 
     // make the count be the resolved value of the promise 
     let responseJSON = JSON.parse(body); 
     return responseJSON.results.count; 
    }); 
} 

然後,你可以使用getNumResults()這樣」

getNumResults(someURL).then(count => { 
    // use the count result in here 
    console.log(`Got count = ${count}`); 
}).catch(err => { 
    console.log('Got error from getNumResults ', err); 
}); 

僅供參考,我認爲如果您想通過設置適當的選項,您也可以自動獲取request()庫來解析您的JSON響應。

+0

這是如此清楚,謝謝sooo多! – Diana