Как мне ждать возвращения axios? - PullRequest
0 голосов
/ 17 октября 2019

Когда я console.log массив в блоке finally в get (), не все значения, которые предполагается получить с помощью помощника () не там. Я предполагаю, что это потому, что метод axios является асинхронным. Я подумал, что если бы я использовал ключевое слово await в helper (), он ожидал бы метод, чтобы все значения, которые я хотел, могли быть напечатаны, но этого не произошло. Есть ли способ, которым я могу ждать на вспомогательный метод?

(function get() {
    let videoThumbnails = new Array();
    axios.get(urlConstants.latestAnimeUrl)
        .then((res) => {
            if (res.status === 200) {
                const html = res.data;
                const $ = cheerio.load(html);
                const thumbnails = $(".post div a img");
                for (let i = 0; i < thumbnails.length; i++) {
                    let videoThumbnail = new Object;
                    videoThumbnail.thumbnailLink = thumbnails[i].attribs['data-cfsrc']; //image thumbnail link, thumbnail dimensions if needed
                    videoThumbnails.push(videoThumbnail);
                }
                const links = $("a[itemprop=url]")
                links.each(async function (i, elem) {
                    if (i < thumbnails.length) {
                        videoThumbnails[i].thumbnailTitle = $(this).attr("title");
                        await helper($(this).attr("href").toString(),videoThumbnails,i);// link to video webpage, but need actual video link

                    }
                });
            }

        })
        .finally(() => {
            console.log(videoThumbnails);
        });
    return videoThumbnails;
})();

function helper(chiaUrl,videoThumbnails,index) {
     axios.get(chiaUrl)
        .then((response) => {
            if (response.status == 200) {
                const $ = cheerio.load(response.data);
                const videoLink = $("div[id=load_anime] div iframe");
                videoThumbnails[index].thumbnailLink = videoLink.attr("src");    
            }
        })
        .finally(()=> {

        })
}

1 Ответ

0 голосов
/ 17 октября 2019

axios.get возвращает обещание. Обещание можно приковать и ждать. Ваша helper функция возвращает undefined. Вы должны вернуть результат axios.get

function helper(chiaUrl,videoThumbnails,index) {
     return axios.get(chiaUrl)
        .then((response) => {
            if (response.status == 200) {
                const $ = cheerio.load(response.data);
                const videoLink = $("div[id=load_anime] div iframe");
                videoThumbnails[index].thumbnailLink = videoLink.attr("src");    
            }
        })
        .finally(()=> {

        })
}

Стоит также отметить, что если вы вернете что-то в пределах .then, это будет результат ожидания (так что у вас нетпередать videoThumbnails и изменить его, чтобы получить результат).

...