2017-07-18 4 views
0

ノードのJSリクエストコールからデータを返すことについて質問をしました。よくある間違いは、文が行単位で実行されるか、同期して実行されるかを仮定することです。ここではそうではありません。このタイプの質問:How to get data out of a Node.js http get requestNode.jsリクエスト関数が返すデータ

私の質問は少し異なります。私は与えられたクエリの結果の数を返す関数getNumber()を書いています。私はコールバック関数によって取得された値をどのように返すのだろうか?例えばので:

私はgetNumResults()responseJSON.results.countを返したい場合はどう
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); 
}); 

}

?どうすればこのことができますか?

答えて

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

のようなgetNumResults()を使用します参考までに、適切なオプションを設定することで、を設定することで、request()ライブラリからJSONレスポンスを自動的に解析できるようになると思います。

+0

これはとても明瞭でした。 – Diana

関連する問題