2017-06-09 10 views
0

私はJSとノードを使い慣れていません。私は、非同期httpリクエストから変数を返そうとしています。問題は呼び出しの非同期な性質だと認識していますが、複数のチュートリアルを読むにもかかわらず、非常に単純なコードスニペット関数を作成する方法を理解できません。Node.js HTTPリクエストからの非同期戻り

誰かがこれが動作するようにマークして、私はそれを消化して自分自身のために変更することはできますか?非同期ライブラリを使用するべきですか?私はいくつかの試みを行い、その作業を行うことができませんでした。

var request = require('request'); 
 
a = 0; 
 

 
a = foo(); 
 
function foo() { 
 
    var num = 1; 
 
    request('http://www.google.com', function (error, response, body) { 
 
     // console.log('error:', error); // Print the error if one occurred 
 
     //console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received 
 
     //console.log('body:', body); // Print the HTML for the Google homepage. 
 
     num = 3; 
 
     return callback(num); 
 
    }) 
 
    return num; 
 
} 
 

 
console.log(a);

+0

コードをデバッグしましたか? –

+0

あなたの返品は* request *モジュールのどこかに返されます –

答えて

0

私はあなたのリクエストを正しくしていると仮定し、その代わりにコールバックのアイデアに焦点を当てます。あなたがこれを試して、もう少し助けが必要なら私に知らせてください。

私は近いあなたが既に持っているものに、このコード維持しようとします:あなたはこのような何かをするだろう3アウトを印刷するために、その後

function foo(callback){ 
    request('http://www.google.com', function (error, response, body) { 
     if(error) 
     console.log(error); 
     //console.log('statusCode:', response && response.statusCode); 
     // Print the response status code if a response was received 
     //console.log('body:', body); // Print the HTML for the Google homepage. 
     num = 3; 
     callback(num); 
    }) 
} 

を。

foo(function(value){ 
    console.log(value); 
}) 

この場合、値3が表示されます。

3を返したい場合は、渡されたコールバック関数にパラメータとして渡す必要があります。コールバックスタイルに従うことを試みると、これに近いものが得られる可能性があります。

function foo(callback){ 
    request('http://www.google.com', function (error, response, body) { 
    if(error) 
     callback(error,null); 
    //do what ever you need to with the response and body 
    num = 3; 
    callback(null,num); 
    }) 
} 
foo(function(err, value){ 
    if(err) 
     console.log(err); 
    console.log(value); 
}) 

あなたは、Robのようなコールバックでは、通常は返さないことを覚えておく必要があります。その代わりに、あなたの関数が渡した別の関数を呼び出し、その関数があなたの関数が決定したパラメーターをその関数に渡します。

+0

ありがとうございました!これははっきりと機能し、私のコードを別に構造化する必要があります。とても有難い。 async/awaitでこれをやろうとするのは理にかなっていますか? – dave

+0

私は非同期待機に慣れていないことを認めます。このような単純なものでは、私は非同期を待たずに待っています。私にとっては、それは本当に状況の複雑さにかかっています。 – Jeff

0

  1. コールバックが値を返さない、
  2. コールバックがアクセス権を持っていないため、/だけでそのコールバック内で非同期呼び出しの結果を操作することができなければなりませんあなたの周辺のコンテキストに、あなたの例でnumは、コールバックがトリガされたときに定義されていません。
  3. コールバックが完了し、その結果が利用可能であることがわかりません。あなたのコード例で

は、fooが常にすぐかかわらず、応答のリターン1 /体がrequestから返されます。

関連する問題