简体   繁体   中英

http requests inside loop of variable size, how to do something only after last request has finished (JavaScript)

I'm using request to make HTTP requests inside a loop of variable size. (I will be reading words from a file, right now I just have an array). I'm adding onto an object (response) with each loop, and want to return the object only after the last request has been completed. I've been playing around with promises but I'm not sure how to chain them since it is a variable number of requests.

const request = require('request');

// eventually this array will be populated by reading a file
var words = ["hello", "there"];
var response = {};

// Loop thruogh input string
for (var i = 0; i < words.length; i += 1) {
    // get next word
    var curWord = words[i];
    // if the current word is not already in the response
    if (!(curWord in response)) {
        // request info from dictionary
        var options = {
            url: 'https://api.dictionaryapi.dev/api/v2/entries/en/' + curWord,
            json: true
        }
        request(options, (err, res, body) => {
            if (err) { return console.log(err); }            
            // find part of speech 
            var partOfSpeech;
            try {
                partOfSpeech = body[0].meanings[0].partOfSpeech
            } catch (err) {
                partOfSpeech = "undefined";
            }  
            // add to response          
            response[curWord] = partOfSpeech;
        });

    }
      
}
// do this part only after last request has been completed
console.log(response);

Basically you need to count the responses knowing that when counter reaches zero you are done with them all.

const request = require('request');

var words = ["hello", "there"];
var response = {};

var count = words.length;

for (var i = 0; i < words.length; i += 1) {
  var curWord = words[i];

  if (!(curWord in response)) {
    var options = {
      url: 'https://api.dictionaryapi.dev/api/v2/entries/en/' + curWord,
      json: true
    }
    request(options, (err, res, body) => {
      count--

      if (err) {
        return console.log(err);
      }
      // find part of speech 
      var partOfSpeech;
      try {
        partOfSpeech = body[0].meanings[0].partOfSpeech
      } catch (err) {
        partOfSpeech = "undefined";
      }
      // add to response          
      response[curWord] = partOfSpeech;

      if (count == 0) {
        // do this part only after last request has been completed
        console.log(response);
      }
    });

  }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM