Как поймать все обещания с топором ios .all? - PullRequest
1 голос
/ 02 апреля 2020

Я очищаю веб-страницу, используя ax ios и cheerio :
Эта веб-страница имеет много ссылок, но при этом при загрузке вниз загружается больше (например, ) facebook ).
Я хочу очистить каждую ссылку при прокрутке , пока не достигну конца.
Это пример моего кода:

cheerio = require('cheerio')
axios = require('axios')

function getLink(id) {
    return axios(options).then(function(response) {
        // Do stuff...
    })
}

function scrollDown() {
    axios(scrollOptions).then(function(response) {
        $ = cheerio.load(response['data'])
        isScrollFinished = ($('.page_more').length == 0)
        promises = []
        newLinks = $('.link') // Get the new links that were loaded while scrolling
        newLinks.each(function() {
            promises.push(getLink($(this).attr('id')))
        })
        axios.all(promises).then(responseArr => {
            if(isScrollFinished) {
                // Exit script
            }
        })
        if(!isScrollFinished) {
            scrollDown()
        }
    })
}

scrollDown()

Проблема с этим кодом в том, что иногда он не очищает все ссылки перед выходом.
Это потому, что последний топор ios .all ждет только пока все ссылки из last прокручиваются страница была очищена.
Как мне это исправить?

1 Ответ

0 голосов
/ 02 апреля 2020

Я создал массив обещаний как переменную stati c и назвал его только ax ios .all, когда прокрутка достигла конца:

cheerio = require('cheerio')
axios = require('axios')

function getLink(id) {
    return axios(options).then(function(response) {
        // Do stuff...
    })
}

function scrollDown() {
    if (typeof scrollDown.promises === 'undefined') { 
        scrollDown.promises = [] // Define static variable if undefined
    }
    axios(scrollOptions).then(function(response) {
        $ = cheerio.load(response['data'])
        isScrollFinished = ($('.page_more').length == 0)
        newLinks = $('.link') // Get the new links that were loaded while scrolling
        newLinks.each(function() {
            scrollDown.promises.push(getLink($(this).attr('id')))
        })
        if(isScrollFinished) {
            axios.all(scrollDown.promises).then(responseArr => {
                // Exit script
            })
        }
        else {
            scrollDown()
        }
    })
}

scrollDown()

Лучшие решения будут с радостью приняты.

...