NodeJS - Как запустить запрос-обещание синхронно? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть две функции, во-первых, у меня есть для l oop внутри этого l oop Я вызываю вторую функцию, у которой есть запрос-обещание. Меня беспокоит то, что когда l oop выполняет и вызывает вторую функцию , он не ожидает обещания запроса до конца sh, l oop выполняет итерацию следующего и снова вызывает вторую функцию , Я хочу сначала запрос-обещание завершить sh, а затем следующую итерацию l oop. Так как бы я это сделал? Для простоты я вставляю фрагменты кода первой и второй функции

Первый фрагмент кода функции


for (let i = 0; i < len; ++i) {
    var url_ = "https://www.someurl****.com" + allUrls_ + urlLastParam + (i + 1).toString();
    console.log(allUrls_);
    console.log('getValues URL: ' + url_);
    getValues(res, url_, allUrls_)
}

Вторая функция

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

function getValues(res, url_, allUrls_) {
    let options = {
        uri: url_,
        transform: function (body) {
            return cheerio.load(body);
        }
    };
    console.log('inside getValues');
    rp(options)
        .then(function ($) {
            console.log('inside getValues function request');
            $('.some-selector').map(function (i, links) {
                // my custom code
            })
        })
        .catch(function (err) {
            // catch errors
        })
}

1 Ответ

1 голос
/ 22 марта 2020

Если вы вернете обещание от getValues(), то вы можете использовать async/await с этим в вашем for l oop, чтобы приостановить l oop для каждого вызова getValues() и упорядочить их, чтобы один за другим, а не все, работающие одновременно:

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

function getValues(res, url_, allUrls_) {
    let options = {
        uri: url_,
        transform: function (body) {
            return cheerio.load(body);
        }
    };
    console.log('inside getValues');
    return rp(options).then(function($) {               // return promise here
        console.log('inside getValues function request');

cheerio here $ ('. some-selector'). map (function (i, links) {// мой пользовательский код}) вернуть что-то; // предположительно вернуть что-то здесь}); }

async function process() {
    try {
        for (let i = 0; i < len; ++i) {
            var url_ = "https://www.someurl****.com" + allUrls_ + urlLastParam + (i + 1).toString();
            console.log(allUrls_);
            console.log('getValues URL: ' + url_);
            let value = await getValues(res, url_, allUrls_);     // await here
        } catch(e) {
            console.log(e);
            // handle any error that occurred in getValues()
        }
    }
}

К вашему сведению, $('.some-selector') не будет работать так, как вы это сделали в этом коде. $ был вашим HTML. Вы должны сначала загрузить контент html в cheerio, прежде чем вы сможете это сделать (что я добавил к своему ответу).

...