检查所有要完成的请求

Check for all requests to be done

我目前正在开发一个异步获取多个 URI 的抓取工具。 我的问题是,我想等待处理所有响应,但我不知道如何找出每个响应的处理时间。

带有 "Done!" 的最后一个日志甚至在响应返回之前就已经 运行。

感谢帮助 泽维尔 :)

const rp = require('request-promise');
const cheerio = require('cheerio');

//The function
function getData(arr) {


    // Using loop to fetch every adress
    for (let i = 0; i < arr.length; i++) {



        //Setting my options
    let opt = {
        method: 'GET',
        //Inserting index into url to get different site every loop
        uri: `https://example.de/${i}`,
        headers: {
            Referer: 'example.de',
        },
        resolveWithFullResponse: true,
        //Loading jquery/cherrio
        transform: function (body) {
            return cheerio.load(body);
        }
    };

    //running the request
    rp(opt)
    .then(($) => {
        console.log('Success fetching Data of : ' + arr[i])
        console.log('Now formatting!')


        //formatting my data ...


    })

    .catch((err => {
        //err handling
        console.error(err.message)
        console.info(`Retrying in ${errDelay / 1000}sec`)
        setTimeout(() => {
            rp(opt)
        }, errDelay);
    }))



}

//This should run after every request is formatted but currently it runs before the requests are done BUT IT DOESN'T
console.log('Done!')


}

getData()``` 

Promise.all就是你想要的。

Promise.all(arr.map((_,i)=>{
    //Setting my options
    let opt = {
        method: 'GET',
        //Inserting index into url to get different site every loop
        uri: `https://example.de/${i}`,
        headers: {
            Referer: 'example.de',
        },
        resolveWithFullResponse: true,
        //Loading jquery/cherrio
        transform: function (body) {
            return cheerio.load(body);
        }
    };

    //running the request
    return rp(opt)
    .then(($) => {
        console.log('Success fetching Data of : ' + arr[i])
        console.log('Now formatting!')


        //formatting my data ...

    })
    .catch((err => {
        //err handling
        console.error(err.message)
        console.info(`Retrying in ${errDelay / 1000}sec`)
        setTimeout(() => {
            rp(opt)
        }, errDelay);
    }))
}).then(()=> console.log('done'))

您可以使用 async await 和 try catch 块来处理错误。

MDN documentation on async await

async function getData(arr) {
  for (let i = 0; i < arr.length; i++) {
    let opt = {
      method: 'GET',
      uri: `https://example.de/${i}`,
      headers: {
        Referer: 'example.de',
      },
      resolveWithFullResponse: true,
      transform: function (body) {
        return cheerio.load(body);
      }
    };

    try {
      const response = await rp(opt);
      console.log('Success fetching Data of : ' + arr[i])
      console.log('Now formatting!')
    }
    catch (e) {
      console.error(err.message)
      console.info(`Retrying in ${errDelay / 1000}sec`)
      setTimeout(() => {
      rp(opt)
      }, errDelay);
    }
  }
}