【发布时间】: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