2013-08-17 2 views
0

내 응용 프로그램의 코드에서 문제로 실행했습니다 나는 그것을 처리하는 가장 좋은 방법을 알고 싶습니다 : 내가 콜백에 5 개 값을 적용하는 기능을 가지고 싶습니다 그것을 사용하는 가장 좋은 방법을 알고 있습니다. 내가 함수가 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; 

내가 이런 식으로 작업을 수행합니다 :

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 개의 값만을 가져 왔으므로, 나는 그것을 적절하게 수행하거나 적절한 콜백을 수행하는 방법을 알고 싶다.

감사합니다.

답변

0

첫 번째 문제점은 이벤트에 5 번 청취자를 지정하는 것입니다. 한 번만 그렇게해야합니다. 콜백을 호출 한 후 결과를 다섯 번 수집 할 수 있습니다.

비동기 응답 end 이벤트가 언제 발생 될 수
var request = require('request'); 

var makeRequests = function(callback) { 
    var result = [], 
     done = 0; 
    request('http://www.google.com', function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      // read the body here 
      var searchFor = [ 
       'nodejs',  // 1 
       'http request', // 2 
       'npm',   // 3 
       'express',  // 4 
       'javascript' // 5 
      ]; 
      for(var i=0; keyword = searchFor[i]; i++) { 
       request('https://www.google.bg/search?q=' + keyword, function (error, response, body) { 
        if (!error && response.statusCode == 200) { 
         result.push(body); 
         ++done; 
         if(done == searchFor.length) { 
          callback(result); 
         } 
        } 
       }); 
      } 
     } 
    }); 
} 

makeRequests(function(result) { 
    console.log("result=" + result.length); 
}) 
+0

, HTTP 요청을받을 수 있도록하는 데 사용됩니다 : 예

. 전체 기능 코드를 사용하여 내 게시물을 더 명확하게 편집 할 것입니다. – user2663041

+0

좋아, 이해하지만 루프 안에 청취자를 붙이는 건 좋은 생각이 아니야. * end * 이벤트에서 많은 함수가 호출되기 때문에 예기치 않은 결과가 발생할 수 있습니다. – Krasimir

+0

예, 필자가 피하려고했던 것입니다. 왜 여기에서 물었습니까? – user2663041

1

당신이 전화 기능은 다음과 같습니다 여기에 요청 모듈을 사용하는 예입니다. 그리고 코드에 따라 res.render이 5 번 실행되지만 5 번 값으로 1 번만 실행하면됩니다. async과 같은 모듈을 사용하면 여러 작업을 수행하는 데 도움이되며 모든 작업이 완료되면 콜백해야합니다.

미안, 내가 루프 내 코드에서 중요하다고 언급하는 것을 잊었다있어
var jsonResult = JSON.parse(body); 
var arr = []; 
for(var i = 0; i < 5; i++){ 
    arr.push(jsonResult[0].interestScore); 
} 
async.map(arr, myAsyncFunction, function(err, results){ 
    // results[0] => response of first index 
    // results[4] => response of last index 
}); 
관련 문제