Node.js 使用npm请求承诺时如何修复奇怪的循环迭代?

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。由于我

我一直在尝试使用web抓取将一些数据从网站中获取到我的节点应用程序中。虽然在我创建的for循环中有奇怪的操作,但数据看起来工作正常

我面临的问题:

  • 迭代不是连续的
  • list.length从1开始,而不是0,为什么
  • 并非所有数据都添加到表中
  • 因此,我正在使用的代码(见下文)在URL列表中运行,然后我将它们添加到名为
    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);
    });