2017-09-11 4 views
0

링크가 활성 상태인지 확인하기 위해 URL을 반복 실행하기 위해 async.forEach를 사용하고 있습니다.Nodejs Async Js : async.forEach 및 async.map을 사용하여 URL 유효성 확인

newLinks가 {는 www.google.com, www.nourl.com, www.xyz.com} 나는 모든 요청을 처리 한 후 같은 기대하고 , 내가 함수가 실행하려는 같은 링크가 포함되어 있습니다, "Async Done"이 인쇄됩니다.

그러나 콘솔이 아래의 결과를주고있다 : 다음, "www.google.com이 다", "비동기 완료" "다음 "완료 "를 funally 두 개의 링크 을 www.nourl.com 최대입니다 "그리고 "www.xyz.com is up "

기본적으로 여기에서 첫 번째 URL 요청 후 아래 코드는 비동기 루프 외부에서 함수를 실행하고 있습니다. async는 모든 URL의 유효성을 검사 한 후에 만 ​​다음 코드를 실행할 수 있다고 생각했습니다.

async.forEach(webservicelinks, function(url, callback) { 
    var Url = "url"; 
    var newLink = newLinks[0]; 
    var proxiedRequest = request.defaults({'proxy': Url}); 
    proxiedRequest(url , function (error, response, body) { 

     if(error){ 
     console.log('Err: '+ error); 
     } 
    if (!error) { 
    if(response.statusCode == 200 || response.statusCode == 201 || response.statusCode == 202){ 
     console.log(url + ' is up!!'); 
     newLink.isActive = true; 
    } 

    if(response.statusCode == 301 || response.statusCode == 302){ 
     console.log(url + ' is redirecting us!!'); 
     return false; 
    } 

    if(response.statusCode == 401){ 
     console.log("you are unauthorized to " + link); 
     return false; 
    }else if (!(response.statusCode == 200 || response.statusCode == 201 || response.statusCode == 202)){ 
     console.log(url + ' is down!!'); 
    } 
    } 
    }); 
    callback(); 
    } , function(err, newLinks) { 
    console.log ("Async Done") ; 
    }); 
    console.log ("Done") ; 
    }); 

답변

1

당신은 async.jseachOfSeries 방법을 사용할 수도 있습니다.

function validateAllLinks(webservicelinks, cb) { 
    async.eachOfSeries(webservicelinks, validateLink, function (err) { 

     if(err) { 
      cb("Validation failed") 
     } else { 
      cb(null, "Success") 
     } 

    }) 

} 

function validateLink(linkData, cb) { 
    var proxiedRequest = request.defaults({'proxy': linkData.linkUrl}); 
     proxiedRequest(linkData.linkUrl , function (error, response, body) { 
      // some validation 
      if(validated) { 
       linkData.linkStatus = true 
      } 
     }) 
} 

// usage: 

validateAllLinks([{linkUrl: 'http://google.com', linkStatus: false}], console.log) 
+0

감사합니다.하지만 validateLink 메소드에서 url 및 cb 이외의 다른 매개 변수는 어떻게 전달합니까? 마찬가지로 linkDataList (linkUrl 및 linkStatus가 포함 된 linkData -> 배열로 전체 목록을 전달하려는 경우 linkUrl이 작동하면 true로 설정하려면 linkStatus를 원할 때)? – Amal

+0

개체를 전달할 수 있습니까? 나는 그 대답을 편집했다. – Ozgur

+0

안녕하세요, 마찬가지로,하지만 문제는 첫 번째 URL 만 유효성이 검사되고 나머지는 실행되지 않는 것과 같습니다. 이유를 모르겠다. – Amal