【问题标题】:Async API Call Looop异步 API 调用循环
【发布时间】:2020-07-03 07:18:02
【问题描述】:

我编写了一个脚本,该脚本组合了一个 URL 列表,我需要循环遍历每个 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 的列表并将每个 URL 作为单独的 API 调用发送。我的输出如下:

我知道我的问题在于“postAPI()”以及我如何一起调用这两个函数。

我很肯定 API 调用可以正常工作,因为我可以单独使用任何输出 URL 并成功发送调用。我怎样才能让这个调用正常工作,以便它遍历 4 个输出 URL 中的每一个并为每个调用提供响应?我已经尝试将 URL 输出到一个数组中,并成功地获得了一个我可以循环的 URL 数组,但我也没有任何enter code here 成功。感谢所有帮助。

【问题讨论】:

  • 已经在这里回答了很多这个问题:stackoverflow.com/a/60778064/816620,但你似乎忽略了我的回答。您当前的代码充满了各种各样的问题,尽管我们中的一些人在上一个问题中向您展示了更好的方法。我可以用这段代码列出十几个问题,所有这些问题都在我之前的答案中得到了解决。当我意识到“等等,我之前已经写过这个”时,我开始写这个问题的答案。在你在另一个问题中使用相同的有缺陷的代码之前,请尝试从人们给你的答案中实际学习。
  • 问题:普通回调与承诺的混合。没有为您手动创建的 Promise 调用 resolve(),因此它永远不会解析,也永远不会有已解析的值。对您手动创建的 Promise 没有错误处理(很多地方您没有调用 reject(err)。等等......
  • 这能回答你的问题吗? Execute .Then() promise NodeJS
  • 是的....我使用了 jfriend 的建议。昨天和整个周末我花了大部分时间才得到它,但我终于明白了每个人都在说什么不解决任何数据。最后,我将 Callbacks 与 Promises 结合起来(这主要是由于在网上尝试了许多示例),试图让某些东西发挥作用。

标签: javascript arrays node.js api asynchronous


【解决方案1】:

我的解决方案基于上一篇文章中的 jfriends cmets,流程如下所示:

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);
                }
            })
        })
});

我的问题源于很多事情,但首先是缺乏对 JS/Nodejs 中的异步操作的理解(尤其是当需要在同一个脚本中进行多个异步 API 调用时)。很抱歉让你们中的一些人感到沮丧,感谢您的帮助,因为我正在学习这些东西......

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 2019-03-24
    • 2013-09-27
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2018-10-17
    相关资源
    最近更新 更多