我正在尝试同时将许多GET请求发送到JSON API。 我在Node.js中使用Bluebird Promise,并使用request-promise发送HTTP请求,如下所示:

const rp = require('request-promise');
//urlsArray is a 5000+ array of urls
Promise.map(urlsArray, url => {
  return rp(url)
    .then(results => { 
       return JSON.parse(results);
    }).catch(err => { log(error);});
}).then(resultsArray => {
  log(resultsArray); // print out results
}).catch(err => {
  log(error);
});

问题在于,数组中有5000多个URL,即使同时进行请求,也可能要花费很长时间,因为map()等到全部完成。 地图正在处理请求时,如何在控制台中输出某种进度指示器(如百分比)?

我已经尝试过log(results); 在每个请求之后,但这只是将5000个内容打印到控制台,这不是很方便。 我希望有一个百分比,或者一个数字,表示要完成的次数。

===============>>#1 票数:2 已采纳

请记住,承诺链就是这样:链。 因此,您可以在每个承诺的链中插入一个then ,以进行控制台更新,并将其传递回它收到的相同值。

实际上,查看您的代码,您甚至不必这样做,因为您已经在使用按URL then处理程序解析JSON。 只需添加:

const rp = require('request-promise');
//urlsArray is a 5000+ array of urls
let completed = 0;                                 // ***
Promise.map(urlsArray, url => {
  return rp(url)
    .then(results => { 
       const parsed = JSON.parse(results);
       ++completed;                                // ***
       console.log(`Completed: ${completed}`);     // ***
       return parsed;
    }).catch(err => { log(error);});
}).then(resultsArray => {
  log(resultsArray); // print out results
}).catch(err => {
  log(error);
});

(请注意,如果JSON无效并抛出该请求,我会先说说该请求已完成,然后再解析JSON。)

但是,如果您尚未进行每个承诺的活动,则可以轻松地插入then处理程序。 这是一个执行此操作的示例(带有本地承诺,但对于Bluebird来说是相同的):

 const data = [1, 2, 3, 4, 5]; function withoutReportingProgress() { return Promise.all( data.map(value => new Promise(resolve => { setTimeout(_ => { resolve(value); }, Math.random() * 500); })) ); } function withReportingProgress() { let completed = 0; // *** return Promise.all( data.map(value => new Promise(resolve => { setTimeout(_ => { resolve(value); }, Math.random() * 500); }) .then(value => { // *** ++completed; // *** console.log(`Completed: ${completed}`); // *** return value; // *** })) // *** ); } console.log("Starting without..."); withoutReportingProgress() .then(_ => { console.log("Done without"); console.log("Starting with"); withReportingProgress() .then(_ => { console.log("Done with"); }); }); 
 .as-console-wrapper { max-height: 100% !important; } 

  ask by frozen translate from so

未解决问题?本站智能推荐: