Asyn c API Call Looop - PullRequest
       21

Asyn c API Call Looop

0 голосов
/ 22 марта 2020

Я написал скрипт, который собирает список URL-адресов, для которых мне нужно l oop через каждый URL-адрес для отправки в виде вызова API.

const fs = require('fs');
const JSZip = require('jszip');
const directoryFile = fs.readdirSync('./zipped');
const fetch = require("node-fetch");
var accessToken = "Bearer <ACCESS TOKEN>";
var url = 'https://<API URL>/';
var data = JSON.stringify({"status":"CONFIGURED", "payloadTracingEnabledFlag":true});
var headers2 = {
    'Content-Type': 'application/json',
    'X-HTTP-Method-Override': 'PATCH',
    'Authorization': accessToken
};

const dir = ('./zipped/');

function buildApiUrls () {
    new Promise((data, err) => {
        fs.readFile((dir + directoryFile), function (err, data) {
            JSZip.loadAsync(data).then(function (zip) {
                const files = Object.keys(zip.files);
                //console.log(files);
                if (err) throw err;
                //console.log(files);
                return files
            })
                .then(value => {
                    const newFileArr = [];
                    value.forEach((files) => {
                        const pkgName = files.substring(files.indexOf("_", files.indexOf("_")) + 1, files.lastIndexOf("_"));
                        const fileExt = files.split('.').pop();
                        const pkgExtract = (pkgName + "." + fileExt);
                        //console.log(pkgExtract);
                        if (pkgExtract !== 'package.properties') {
                            //const pkgExtract = (pkgName + "." + fileExt);
                            //console.log(pkgExtract);
                            const split_string = pkgExtract.split(/(\w[0-9]\.)/);
                            const versionSlice = split_string.slice(0 - 6).join('');
                            versionSlice.slice(0, -4).toString();
                            const nameSlice = split_string[0].toString();
                            const name = nameSlice.slice(0, -1);
                            const apiDeployable = name + "|" + versionSlice;
                            //console.log(apiDeployable);
                            //data = ("APIDEPLOYABALE = ") + encodeURIComponent(apiDeployable);
                            //newFileArr.push(url + apiDeployable);
                            const apiUrls = (url + apiDeployable);
                            //console.log(apiUrls);
                            return apiUrls;
                        }

                    });
                });
        });

    })
        .catch(err => {
            console.log(err)
        });
}


function postApi (apiUrls) {
    const promises = async apiUrlCall => {
        return await fetch(url, {method: "POST", headers: headers2, body: data})
    };

   return promises(apiUrls);

}

postApi(buildApiUrls()).then(resp => {
    const response = resp.json();
    console.log(response)
});

В настоящее время функция "buildApiUrls ()" возвращает правильный вывод, и 4 URL-адреса правильно отображаются в console.log. Проблема заключается в том, где я пытаюсь просмотреть список из 4 URL-адресов и отправить каждый как отдельный вызов API. Мой вывод следующий:

enter image description here

Я знаю, что моя проблема связана с "postAPI ()" и тем, как я вызываю две функции вместе.

Я уверен, что API Call работает, потому что по отдельности я могу использовать любой из выходных URL и успешно отправить вызов. Как я могу заставить этот вызов работать так, чтобы он просматривал каждый из 4 выходных URL-адресов и предоставлял ответ для каждого вызова? Я попытался вывести URL-адреса в массив и успешно получить массив URL-адресов, через которые я могу пройти oop, но у меня тоже не было enter code here успеха с этим. Вся помощь приветствуется.

1 Ответ

0 голосов
/ 24 марта 2020

Мое решение было основано на комментариях друзей на предыдущем посте, и поток выглядит примерно так:

new Promise(function(resolve, reject) {
          <code to do something>
            return output1
        }).then
            <code to do something>
            return output2
        }).then
            <code to do something>
            return output3
            }).then( fetchLoop = async () => {
                const resArr = [];
                for() {
                    const response = await fetch(element, {method: "POST", headers: headers, body: data});
                    const res = await response;
                    resArr.push(res);
                    console.log(resArr);
                }
            })
        })
});

Мои проблемы возникли из-за множества вещей, но, прежде всего, из-за отсутствия понимания асинхронных c операций в JS / Nodejs (особенно при необходимости сделать несколько асинхронных c вызовы API внутри одного и того же скрипта). Извиняюсь за разочарование некоторых из вас, помощь очень ценится, когда я изучаю этот материал, как я go .....

...