У меня возникла проблема с кодом моего приложения, и я хотел бы знать, как лучше ее обрабатывать: у меня есть функция, которая применяет 5 значений для обратного вызова, и мне бы хотелось знать лучший способ его использования.Node.js: множественные обратные вызовы от одной функции
Вот мой код функции:
var someFunc = function(callback) {
var http = require('http');
var id;
var url = 'http://somesite.com/json';
// First request to get an array of 5 elements
http.get(url, function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
var jsonResult = JSON.parse(body);
// 5 requests with a value from each of the 5 elements
for (var i=0;i<5;i++)
{
(function(idx) {
gameId = jsonResult.gameList[idx].id;
url = 'http://somesite.com' + id + '/token';
http.get(url, function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
jsonRes = JSON.parse(body);
callback.apply(null, [idx, jsonRes.interestScore]);
});
}).on('error', function(e) {
console.log("Got error: ", e);
});
})(i);
}
});
}).on('error', function(e) {
console.log("Got error: ", e);
});
};
exports.someFunc = someFunc;
Когда я вызываю функцию для получения 5 значений Я делаю это так:
exports.featured = function(req, res){
getSome.someFunc(function callback(result) {
var variables = {};
var variableName = result;
variables[variableName] = jsonRes.interestScore;
res.render('featured', { score0: variables[0], score1: variables[1], score2: variables[2], score3: variables[3], score4: variables[4] });
});
};
К сожалению «res.render» вызывается после того, функция получает только 1 значение, поэтому я хочу знать, как это сделать, или сделать правильный обратный вызов.
Спасибо.
извини, я забыл упомянуть, что цикл играет важную роль в моем коде, он используется, чтобы сделать HTTP GET запрос. Я отредактирую свой пост с полным кодом функции, чтобы быть более четким. – user2663041
Хорошо, я понимаю, но вставку слушателя внутри цикла - это не очень хорошая идея. Это приведет к неожиданным результатам, потому что у вас есть много функций, вызываемых этим событием * end * – Krasimir
Да, я понимаю, этого я и пытался избежать, и почему я спросил здесь. – user2663041