2017-09-11 8 views
0

私はURLを反復してリンクがアクティブかどうかをチェックするためにasync.forEachを使用しています。Nodejs Async Js:async.forEachとasync.mapを使用してURLを検証する

newLinksは、私はすべての要求が処理された後のように期待してい {www.google.com、www.nourl.com、www.xyz.com}のようなリンクが含まれています、私は実行する機能が欲しいです、 「非同期完了」を表示します。

しかし、コンソールは、以下の結果を与えている: 「www.google.comがアップしている」、そして 「非同期で完了」、そして 「「完了」とfunally二つのリンク www.nourl.comがアップしています"と " www.xyz.comがアップ "

これは基本的にここで、最初のURL要求の後、私のコードは、非同期ループの外で関数を実行しています。私は、非同期は、すべての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が動作している場合はlinkStatusをtrueに設定したい)のリスト全体を渡したいのですか? – Amal

+0

オブジェクトを渡すことはできますか?私は答えを編集しました。 – Ozgur

+0

こんにちはありがとう、私も同様でしたが、問題は最初のURLだけが検証され、残りは実行されていないようなものです。理由は分かりません。 – Amal

関連する問題