2017-02-11 14 views
1

requestcheerioを使用して、ポストパラメータからのリンクから各動画のsrcを取得しようとしています。各ループごとにリクエストURLを変更するにはどうすればよいですか?

各動画のsrcを取得するには、すべてのループでrequestオプションのurlを変更する必要があります。しかし、以下のsrcのようなコードを取得しようとすると、リクエストのurlを変更するのがリクエストよりも速いため、リクエストのURLを変更することはリクエストが完了する前に行われます。私が欲しいものを実現するために私は何ができますか?

ここでコード

let opt = { 
    transform: function(body) { 
     return cheerio.load(body); 
    } 
}; 

router.post('/api', function(req, res) { 
    let idArray = req.body.data; 
    for(var i=0; i<idArray.length; i++) { 
     opt.uri = baseURL + idArray[i]; 

     request(opt) 
      .then(function($) { 
       console.log($('video').src); 
      } 

ログ(それは同じことを印刷します) https://example.mp4/asdfasdf https://example.mp4/asdfasdf

私はこのコードを使用する場合、私はidArrayから未定義の取得EDIT

[i]を

です
for(var i=0; i<idArray.length; i++) { 
     console.log("Before", baseURL + idArray[i]) 
     rpap(baseURL + idArray[i]) 
      .then(function($) { 
       console.log(idArray); 
       console.log("After", baseURL + idArray[i]); 
} 

ログ

before http://example.com/adsfasdf 
before http://example.com/famvvasd 
after http://example.com/undefined 
after http://example.com/undefined 

答えて

0

は、理由だけではなく、グローバルオプションオブジェクトを使用して新しいURIをマージしませんか?私は、複数の要求を行うことができ、予期しない方法で小道具を変更することができるので、グローバルオプションオブジェクトを変更することに対してアドバイスをします。

for (var i = 0; i < idArray.length; i++) { 
    let uri = baseURL + idArray[i]; 

    request({ 
     ...opt, 
     uri // expands to uri: uri as per es6 style 
    }) 
    .then(function($) { 
     console.log($('video').src); 
    }) 
} 

また、常にトランスフォームオプションを使用する場合は、デフォルトとして設定することができます。要望があれば、それは次のようになります(ドキュメントから):

var rpap = rp.defaults({ transform: autoParse }); 

rpap('http://google.com') 
    .then(function (autoParsedBody) { 
     // :) 
    }); 

rpap('http://echojs.com') 
    .then(function (autoParsedBody) { 
     // =) 
    }); 
+0

「... opt、uri」の意味を理解できません。 –

+0

@PhillipYSこれは[ES6のデストラクション割り当て](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)の一部です。基本的に '... opt'は' opt'の中の全てのプロパティを書き込まれたオブジェクトに展開します。 '{uri}'は有効なES6であり、 '{uri:uri} 'と同じ意味です。ですから、処理されたコードは 'request({transform:function(){...}、uri:uri})'と似ています。 –

関連する問題