forEach循环中的NodeJs功能需要先完成,然后再转到下一项

我有一个Nodejs脚本,其详细信息如下所示:


1)它向API请求以获取城市列表,它将获取JSON数组。使用此数组,我使用进行循环forEach。


2)在每次迭代(第二循环)时,我确实再次向API请求以获取详细信息(约100行)并将其插入mysql数据库。


我的问题是,如何在进入下一个项目(城市)之前使函数在第一个循环(要获取城市列表的位置)内等待完成。我想使循环具有延迟顺序。


我的源代码:


const request = require('request');

var moment = require('moment');

var mysql = require('mysql');


var a = moment('2019-04-01');

var b = moment('2019-04-06');

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));


function timer(ms) {

 return new Promise(res => setTimeout(res, ms));

}


var connection = mysql.createConnection({

    host : 'localhost',

    user : 'user1',

    password : 'password',

    database : 'local'

});


async function getURL(id_city,dates) {


    var url = 'https://localhost/api/format/json/schedule/city/'+id_city+'/date/'+dates;    

    request(url, { json: true }, (err, res, body) => {

      if (err) { return console.log(err); }

      // console.log(body.status);

      var item1 = body.schedule.data.item1;

      var item2 = body.schedule.data.item2;


      connection.connect();

      connection.query('INSERT INTO schedule (city,item1,item2) values ("'+id_city+'","'+task1+'", "'+task2+'")', function (error, results, fields) {

         if (error) throw error;

      });

      // connection.end();    

    });

}



async function getDate(id_city)

{

    var end;

    for (var m = moment(a); m.isBefore(b); m.add(1, 'days')) {

        getURL(id_city,m.format('YYYY-MM-DD'));

        await timer(1000); //making delay           

    }

}


async function main () {    

    var url = 'https://localhost/api/format/json/list_city';

    connection.connect();

    request(url, { json: true }, (err, res, body) => {

      if (err) { return console.log(err); }


          var list_city = body.city; //this is an array

          var counter = 0;

          list_city.forEach(function(city){

              getDate(city.id, function(){


              });//i need this to complete before go to next city


          });

    });//end request url

}


main();



动漫人物
浏览 304回答 2
2回答

暮色呼如

使用for循环代替forEach,并在每次迭代await中调用getDate,以便一个getDate调用始终在再次调用之前完成:for (let i = 0; i < list_city.length; i++) {&nbsp; await getDate(city[i]);&nbsp; await timer(100); // this will put a delay of at least 100ms between each call}确保使包含功能async起作用。请注意,由于getDate返回Promise,因此它可能不应该接受回调-而是将awaits或thens链接到末尾。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript