2016-09-27 10 views
1

私はcheerioでデータスクラップを構築し、URLの配列からデータを取得しました。それは、私が廃棄したデータよりも多くのURLの正確な同じ配列を返します。私はこれをやってみましたが、動作しません処理エラーオーバーループ配列要求

function getNbShares(urls) { 
    return Promise.map(urls, request).map((htmlOnePage, index) => { 
     const $ = cheerio.load(htmlOnePage), 
      share = $('.nb-shares').html(); 
     return { 
      url: urls[index], 
      value: share 
     }; 
    }); 
} 

function getNbShares(urls) { 
    return Promise.map(urls, request).map((htmlOnePage, index) => { 
     const $ = cheerio.load(htmlOnePage); 
      if(error) { 
       return { 
        url: urls[index], 
        value: null } 
      } else { 
      share = $('.nb-shares').html(); 
       if (!share) { 
        return { 
        url: urls[index], 
        value: null } 
        } else { 
         return { 
          url: urls[index], 
          value: share 
         }; 
        }} 
    }); 
} 

[{url: urls, value: share}] 

それは完璧に働いていますが、エラーを処理しない:私の出力配列は、このようにフォーマットされますそのアイデアは何が起こったとしても、URLが返答しない場合、またはスクラップが動作しない場合、常にURLに返されます。

私はこのfunction(req,error)のような機能を渡す必要がありますが、私は場所を正確に...

答えて

1

は「キャッチ」にエラーをしてみませんか?推測Promise Catch Docs

function getNbShares(urls) { 
    return Promise.map(urls, request).map((htmlOnePage, index) => { 
    const $ = cheerio.load(htmlOnePage), 
     share = $('.nb-shares').html(); 
    return { 
     url: urls[index], 
     value: share 
    }; 
}) 
    .catch((error) => //do something here with error) 
} 
+0

私はこの '.catchような試み(関数(ERR){1)、リターンurls.splice(URLの[インデックス]を、getNbShares(のURL);});'が、動作しません。アイデアは私がエラーをキャッチするだけでなく、同時に私の配列を構築する必要があるということです。 –

+0

.mapの代わりにPromise.reduceを使うのはどうでしょうか?配列に入れたくない "エラー"や値がある場合は、そうする必要はありません。 – Rastalamm

+0

実際、オブジェクトとして配列にすべてを入れたいと思います。私はちょうどエラーがキャッチされている場合、そのgetNbShares(URL)を停止したくないです。私の質問ははっきりしているのですか、それとも書き直すべきですか? –

関連する問題