在 get 请求的 do while 循环中使用闭包
Using a closure in a do while loop for a get request
我有 5 个端点需要从中获取信息。我一次只能抓取 500 个对象。我的思考过程是我需要遍历每个端点并将返回的结果推送到我的对象。然后,我将请求嵌套在一个 do while 循环中,以确保该循环一直持续到整个 obj.例如,如果我有 50,000 个候选人,do while 循环将执行 100 次并将每个结果推送到 obj,然后在完成后将其推送到 parentObj。由于异步性质,我 运行 遇到循环在返回 get 请求之前完成的问题。由于顺序无关紧要,我如何确保在循环递增之前请求 returns 成功?我正在阅读 David 的 Article 并且闭包适用于 for 循环但不是一段时间。在这种情况下,关闭将如何工作?如果我的逻辑不正确,请纠正我。
var dataArr = ['/v1/candidates?per_page=500&page=1','/v1/eeoc?per_page=500&page=1','/v1/jobs?per_page=500&page=1','/v1/job_stages?per_page=500&page=1','/v1/applications/?per_page=500&page=1'];
var parentObj = {};
for ( var i = 0; i < dataArr.length; i++ ) {
var options = {
hostname: 'myURL',
port: 443,
path: dataArr[i],
method: 'GET',
headers: {
'Authorization' : 'Basic MYKEY',
}
};
var obj = {};
do {
https.get(options, (res) => {
res.on('data', (d) => {
var result = d.toString('utf8');
// push returned result object to obj
});
}).on('error', (e) => {
console.error(e);
});
} while (obj.length % 500 === 0 && obj.length ==! 0);
// push obj to parentObj here
}
};
callback(null, parentObj);
问题不是闭包,问题是请求的回调将在循环完成后发生,而它永远不会发生。所以在继续循环之前你必须等待请求:
(async function() {
for ( var i = 0; i < dataArr.length; i++ ) {
var options = {
hostname: 'myURL',
port: 443,
path: dataArr[i],
method: 'GET',
headers: { 'Authorization' : 'Basic MYKEY' }
};
var obj = {};
do {
try {
const request = await new Promise(resolve => https.get(options, resolve));
const result = await new Promise((resolve, reject) => {
request.on("data", d => resolve(d.toString("utf8")));
request.on("error", reject);
});
} catch(e) { /* handle request errors */ }
} while (obj.length % 500 === 0 && obj.length ==! 0);
// push obj to parentObj here
}
callback(null, parentObj);
}
})();
https
库可能会提供一些助手来处理 promise,但由于我不知道它们,所以我手动创建了它们
我有 5 个端点需要从中获取信息。我一次只能抓取 500 个对象。我的思考过程是我需要遍历每个端点并将返回的结果推送到我的对象。然后,我将请求嵌套在一个 do while 循环中,以确保该循环一直持续到整个 obj.例如,如果我有 50,000 个候选人,do while 循环将执行 100 次并将每个结果推送到 obj,然后在完成后将其推送到 parentObj。由于异步性质,我 运行 遇到循环在返回 get 请求之前完成的问题。由于顺序无关紧要,我如何确保在循环递增之前请求 returns 成功?我正在阅读 David 的 Article 并且闭包适用于 for 循环但不是一段时间。在这种情况下,关闭将如何工作?如果我的逻辑不正确,请纠正我。
var dataArr = ['/v1/candidates?per_page=500&page=1','/v1/eeoc?per_page=500&page=1','/v1/jobs?per_page=500&page=1','/v1/job_stages?per_page=500&page=1','/v1/applications/?per_page=500&page=1'];
var parentObj = {};
for ( var i = 0; i < dataArr.length; i++ ) {
var options = {
hostname: 'myURL',
port: 443,
path: dataArr[i],
method: 'GET',
headers: {
'Authorization' : 'Basic MYKEY',
}
};
var obj = {};
do {
https.get(options, (res) => {
res.on('data', (d) => {
var result = d.toString('utf8');
// push returned result object to obj
});
}).on('error', (e) => {
console.error(e);
});
} while (obj.length % 500 === 0 && obj.length ==! 0);
// push obj to parentObj here
}
};
callback(null, parentObj);
问题不是闭包,问题是请求的回调将在循环完成后发生,而它永远不会发生。所以在继续循环之前你必须等待请求:
(async function() {
for ( var i = 0; i < dataArr.length; i++ ) {
var options = {
hostname: 'myURL',
port: 443,
path: dataArr[i],
method: 'GET',
headers: { 'Authorization' : 'Basic MYKEY' }
};
var obj = {};
do {
try {
const request = await new Promise(resolve => https.get(options, resolve));
const result = await new Promise((resolve, reject) => {
request.on("data", d => resolve(d.toString("utf8")));
request.on("error", reject);
});
} catch(e) { /* handle request errors */ }
} while (obj.length % 500 === 0 && obj.length ==! 0);
// push obj to parentObj here
}
callback(null, parentObj);
}
})();
https
库可能会提供一些助手来处理 promise,但由于我不知道它们,所以我手动创建了它们