Как вызвать один и тот же API несколько раз в Express Route? - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над приложением Node с Express.Я приковываю несколько http-вызовов к API данных, каждый из которых зависит от ответов предыдущего запроса.

Все работает, кроме последнего звонка.Последний вызов должен произойти несколько раз, прежде чем страница должна отобразиться.

Поиск показал отличные примеры того, как объединять, но не каждый раз вызывать один и тот же API (или HTTP GET, конечную точку данных и т. Д.) С разными параметрами.

Я попробовал этот метод здесь ( Express | Выполнение нескольких http-запросов асинхронно ) с async.waterfall, а также попробовал async-kit.Ни один из них никогда не перейдет к окончательному обратному вызову, и они просто зависнут.

Код ниже не использует асинхронный вызов.Я вернулся, потому что я не уверен, что лучший способ.

Я пытаюсь сделать что-то вроде этого: Использование генератора для многократного вызова API и разрешения только после завершения всех запросов?

Это лучшеепуть?Я не хочу использовать такие модули, как async-kit, потому что они перестают поддерживаться через год или два.Хотя это было бы здорово.Любая помощь с благодарностью.

var getJSON = (options, fn) => {
    .....
}

router.route("/")
    .get((req, res) => {
        var idArray = [];
        var results = [];
        getJSON({
            .... send params here, (result) => {

            //add response to results array
            results.push(result);

            //create var for data nodes containing needed id params for next call
            let group = result.groupsList;

            //get id key from each group, save to idArray
            for(i=0;i<groups.length;i++){
                idArray.push(groups[I].groupId);
            }

            //use id keys for params of next api call
            dataCallback(idArray);

        });  

        function dataCallback(myArray){
            // number of ID's in myArray determine how many times this API call must be made
            myArray.forEach(element => {
                getJSON({
                    .... send params here, (result) => {
                    results.push(result);
                }); 
            // put render in callback so it will render when resolved
            }, myRender());
        };

        function myRender() {
            res.render("index", { data: results, section: 'home'});
        }

    })
...