2017-01-16 12 views
0

Ok、私は作成しているNodeJSアプリケーションを持っています。 JSONデータを返すAPIにHTTPリクエストを送信します。これはsocket.ioを使用してリアルタイムでクライアントに表示します。 setInterval()を使用して関数を 'x'秒間実行しています。最初に送信されたデータがないSocket.ioオブジェクト[setInterval]

グローバル変数を宣言し、接続が確立されたとき(socket.io)に関数を呼び出し、setInterval()を使用しても機能しない場合があります。

問題: 最初の 'x'秒間に未定義のデータが表示されます。 HERESに私のコード(私は不要な部分を削除しています)

var globalObject = {} 
function APICall() { 
request.get(APIUrl, function (error, response, body) { 
globalObject = JSON.parse(body) 
})} 
io.on('connection', function (socket) { 
APICall() 
socket.emit('newdata', globalObject) 
} 

setInterval(function() { 
request.get(bitstampAPI, function (error, response, body) { 
    bitstamp = JSON.parse(body) 
    socket.emit('price', bitstamp) 
    }) 
    }, 10000) 
}) 

P.S:そこにはいくつかの問題がある可能性がありますので、中括弧と括弧のエラーを無視しますが、私は私のアプリから不要なロジックの一部を削除しました。

ボトムライン:最初の10秒間、socket.ioはその後、その中にデータのないオブジェクトを発し、のsetInterval()がで蹴り、私が見たものから、API

+0

'setInterval'は10秒が経過するまで最初のリクエストをしないので、最初にデータを取得するための最初のリクエストを行う必要があります。 –

答えて

0

からデータを送信しますここでは、接続を取得するとすぐに'newdata'を発しますが、の前にの前には、APIUrlからの応答があります。

あなたが実際にglobalObjectを更新した後、あなたが'newdata'を発することができる、約束を返却するか、コールバックを受け取るためにあなたのAPICall機能を変更する必要があります。

このような何か(コールバック):

var globalObject = {}; 
function APICall(callback) { 
    request.get(APIUrl, function (error, response, body) { 
    if (error) { 
     // handle error 
    } else { 
     var data = JSON.parse(body); 
     globalObject = data; 
     callback(data); 
    } 
    }); 
} 

io.on('connection', function (socket) { 
    APICall(function(data) { 
    socket.emit('newdata', data) 
    }); 
}); 

またはこれ(約束):

var globalObject = {}; 
function APICall() { 
    return new Promise(function (resolve, reject) { 
    request.get(APIUrl, function (error, response, body) { 
     if (error) { 
     reject(error); 
     } else { 
     var data = JSON.parse(body); 
     globalObject = data; 
     resolve(data); 
     } 
    }); 
    }); 
} 

io.on('connection', function (socket) { 
    APICall().then(function (data) { 
    socket.emit('newdata', data) 
    }); 
}); 

PSあなたが見ることができるように、私はすべてのグローバル変数を使用する(とハンドルませんエラー)。

+0

両方のコードブロックを理解できませんでした。 :( – Satonamo

関連する問題