Node.js 使用npm请求承诺时如何修复奇怪的循环迭代?
我一直在尝试使用web抓取将一些数据从网站中获取到我的节点应用程序中。虽然在我创建的for循环中有奇怪的操作,但数据看起来工作正常 我面临的问题:Node.js 使用npm请求承诺时如何修复奇怪的循环迭代?,node.js,request-promise,Node.js,Request Promise,我一直在尝试使用web抓取将一些数据从网站中获取到我的节点应用程序中。虽然在我创建的for循环中有奇怪的操作,但数据看起来工作正常 我面临的问题: 迭代不是连续的 list.length从1开始,而不是0,为什么 并非所有数据都添加到表中 因此,我正在使用的代码(见下文)在URL列表中运行,然后我将它们添加到名为options的对象中,最后在request promise函数中传递该选项。第一个问题是,在一次试验中,它将在这个序列1、2、0上执行,而在另一次试验中,它可能会执行0、2、1。由于我
options
的对象中,最后在request promise
函数中传递该选项。第一个问题是,在一次试验中,它将在这个序列1、2、0上执行,而在另一次试验中,它可能会执行0、2、1。由于我使用GET请求访问服务器,我认为加载数据需要时间,因此我尝试使用async
和await
,但都不起作用。我也尝试过睡眠,但也没有成功。序列仍然不稳定
第二个问题是列表的长度不是从0开始,而是从1开始。(即let list=[“0”、“1”、“2”、“3”]
的长度为4)。默认情况下是否在节点中
第三个问题是,即使进行了所有迭代(即使顺序错误),有时也会显示比预期更少的数据
const listOfJobIds = ["MTM2NDQtMTE1NzQ2LVMgMQ", "MjI3MjkwIDU", "MjI3MjIzIDU"];
let listLength = listOfJobIds.length - 1;
let options = {};
function loopJobs(listOfJobIds) {
for(let i=0; i<listOfJobIds.length; i++){
//Declare options for the request-promise
options = {
url: 'https://ec.europa.eu/eures/eures-searchengine/page/jv/id/'+listOfJobIds[i]+'?lang=en&_=1594981312724&app=2.4.1-build-2',
json: true
}
rp(options).then(
async (data) => {
await getJobInformation(data, i);
}
).catch(
(err) => {
console.log(err);
}
);
}
}
loopJobs(listOfJobIds);
async function getJobInformation(data, i) {
process.stdout.write('JOB: '+i+' - Loading JOB information ');
//GET SOME DATA
var language = data.jvProfiles[data.preferredLanguage];
let job_id = data.id;
process.stdout.write('. ');
let job_vacancy_id = data.documentId;
process.stdout.write('. ');
let job_title = language.title;
process.stdout.write('. ');
let job_description = language.description;
process.stdout.write('. ');
//ADD INFORMATION IN THE TABLE
job_table.push([
job_id,
job_vacancy_id,
job_title,
job_description
]);
console.log("✅");
if(i == listLength){
printTable1();
}
}
如果您试图对调用
getJobInformation()
进行排序,则可以执行以下操作:
async function loopJobs(listOfJobIds) {
for (let i=0; i<listOfJobIds.length; i++){
//Declare options for the request-promise
let options = {
url: 'https://ec.europa.eu/eures/eures-searchengine/page/jv/id/'+listOfJobIds[i]+'?lang=en&_=1594981312724&app=2.4.1-build-2',
json: true
}
let data = await rp(options);
await getJobInformation(data, i);
}
printTable1(); // I would suggest removing this call from getJobInformation()
}
loopJobs(listOfJobIds).then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
异步函数loopJobs(listOfJobIds){
for(设i=0;i{
控制台日志(“全部完成”);
}).catch(错误=>{
控制台日志(err);
});
注意:
getJobInformation()
不是一个经典的异步函数。它写入的流有点异步,但函数中没有任何内容被等待,因此,使其异步
或等待
是没有用的。您并行运行所有请求,并且它们以服务器决定的任何顺序完成要完成这些操作,每次可能都不一样。您是否打算按顺序运行您的操作,其中第二个操作直到第一个操作完成后才开始?这就是我的想法,并尝试使用async
wait
sleep
。但无法让它工作:/n好吧,一个正确的实现使用wait
可以正常工作,因此很明显您的实现中存在错误。我们无法帮助您修复您未向我们展示的代码版本。从您的其他观察结果来看,这听起来像getJobInformation()
也可能包含一些竞争条件。我不知道它检索信息的顺序,但我需要所有结果(在这种情况下为3)。好的,我将再次尝试使用它,并更新我的问题。您还应该包括getJobInformation()的代码
因为部分问题可能存在于该函数中。这既简洁又高效。工作非常好,从0.1.2-打印表格-打印“全部完成”。谢谢。
JOB: 2 - Loading JOB information . . . . ✅
┌──────────────┬──────────────────┬────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────┐
│ Job ID │ Job Vacancy ID │ Job Title │ Job Description │
├──────────────┼──────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│ MjI3MjIzIDU │ 227223 │ DATABASE ADMINISTRATION │ -MANAGING DATABASES ON PREMISES AS WELL AS IN CLOUD -HANDLING MIGRA… │
└──────────────┴──────────────────┴────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┘
JOB: 1 - Loading JOB information . . . . ✅
JOB: 0 - Loading JOB information . . . . ✅
async function loopJobs(listOfJobIds) {
for (let i=0; i<listOfJobIds.length; i++){
//Declare options for the request-promise
let options = {
url: 'https://ec.europa.eu/eures/eures-searchengine/page/jv/id/'+listOfJobIds[i]+'?lang=en&_=1594981312724&app=2.4.1-build-2',
json: true
}
let data = await rp(options);
await getJobInformation(data, i);
}
printTable1(); // I would suggest removing this call from getJobInformation()
}
loopJobs(listOfJobIds).then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});