2017-08-19 13 views
0

node.jsにはまったく問題ありません私は単純なように見えるが、うまくいかないようなことをしようとしている。私はWebページからコンテンツを取得するために要求npmモジュールを使用しています。そのプログラムで後でそのコンテンツを使用したいのですが、要求から取得したデータを返す方法や、その変数が後でプログラムの範囲外になるため、変数に文字列として格納する方法がないようです。Node.jsのWebページからコンテンツを取得しています

ご覧のとおり、私はページにリクエストしています。 URLは単なるテキストですが、後でJSONデータを解析してオブジェクトを初期化する予定です。オブジェクトの初期化には、入力として文字列が必要です。しかし、私はどのように要求内の関数の要求の範囲外でそのデータを使用するか分かりません。

ご指摘いただければ幸いです。

var request = require('request'); 
stateString = ''; 


function getState() { 

request('http://content.warframe.com/dynamic/worldState.php', function (error, response, body) { 
     stateString = body; 
    }); 
} 

getState(); 
console.log(stateString); 
+0

リクエストは非同期であり、console.logが呼び出された後に発生することを覚えておく必要があります。 stateString = bodyを設定する場所の下にconsole.logを置いてみてください。 – OwChallie

答えて

0

コメントに記載されているOwChallieと同様に、リクエストは非同期で送信されます。つまり、console.logは要求が完了する前に実行されます。

getState()関数にコールバックを渡すか、Promisesを調べることでこの問題を解決できます。このような基本的な例では、コールバックはちょうどいいです。しかし、コードのロジックが複雑になると、コードを管理しやすくするためにPromisesを調べることを強くお勧めします。

例:

var request = require('request'); 

var url = "http://content.warframe.com/dynamic/worldState.php"; 

function getStateUsingCallback(callback) { 
    request(url, function (error, response, body) { 
    callback(body); 
    }); 
} 

function getStateUsingPromise() { 
    return new Promise(function (resolve, reject) { 
    request(url, function (error, response, body) { 
     if (error) return reject(error); 

     return resolve(body); 
    }); 
    }) 
} 

// Option 1: Using a callback 
getStateUsingCallback(function(body) { 
    console.log(body); 
}); 

// Option 2: Using a Promise 
getStateUsingPromise() 
    .then(function (body) { 
    console.log(body); 
    }) 
    .catch(function (error) { 
    console.error(error); 
    }); 

代わりに、同期的に実行するための要求を強制することができます。したがって、関数は最後の行を実行する前に完全に実行されます。ただし、非同期コードの作成と処理は、Node.jsの機能がある場所であるため、開始することを強くお勧めします。

関連する問題