forEach循环中的XMLHTTPRequest不起作用

时间:2018-08-30 19:11:03

标签: javascript node.js foreach xmlhttprequest

嗨,我正在编写一个简短的node.js应用程序,该应用程序每次在数组上进行迭代时都会向API发送XMLHTTPRequest。问题是由于异步特性,它在返回请求之前会继续执行foreach循环。我可能忽略了一些大问题,但今天下午大部分时间都花在了我上面。我尝试使用await无效,任何解决方案将不胜感激。

谢谢。

NODE JS应用

from urllib.request import urlopen
from bs4 import BeautifulSoup

file = "5_twitterBBC.csv"
f = open(file, "w")
Headers = "tweet_user, tweet_text,  replies,  retweets\n"
f.write(Headers)
for page in range(0,5):
    url = "https://twitter.com/BBCWorld".format(page)
    html = urlopen(url)
    soup = BeautifulSoup(html,"html.parser")
    tweets = soup.find_all("div", {"class":"js-stream-item"})
    for tweet in tweets:
        try:
            if tweet.find('p',{"class":'tweet-text'}):
             tweet_user = tweet.find('span',{"class":'username'}).text.strip()
             tweet_text = tweet.find('p',{"class":'tweet-text'}).text.encode('utf8').strip()
             replies = tweet.find('span',{"class":"ProfileTweet-actionCount"}).text.strip()
             retweets = tweet.find('span', {"class" : "ProfileTweet-action--retweet"}).text.strip()
             print(tweet_user, tweet_text,  replies,  retweets)
             f.write("{}".format(tweet_user).replace(",","|")+ ",{}".format(tweet_text)+ ",{}".format( replies).replace(",", " ")+ ",{}".format(retweets) +  "\n")
        except: AttributeError
f.close()

XMLHTTPRequest模块

const mongoose = require("mongoose");
const fs = require("fs");
const ajax = require("./modules/ajax.js");

// Bring in Models
let Dictionary = require("./models/dictionary.js");


//=============================
//     MongoDB connection
//=============================

// Opens connection to database "test"
mongoose.connect("mongodb://localhost/bookCompanion");
let db = mongoose.connection;

// If database test encounters an error, output error to console.
db.on("error", (err)=>{
  console.console.error("Database connection failed.");
});

// Check for connection to the database once.
db.once("open", ()=>{
  console.info("Connected to MongoDB database...");

  fs.readFile("./words.json", "utf8", (err, data)=>{

    if(err){
      console.log(err);
    } else {
      data = JSON.parse(data);
      data.forEach((word, index)=>{

        let search = ajax.get(`LINK TO API?=${word}`);

        search.then((response)=>{

          let newWord = new Dictionary ({
            Word: response.word,
            phonetic: response.phonetic,
            meaning: response.meaning
          }).save();

          console.log(response);

        }).catch((err)=>{
          console.log(err);
        });

      });
    }

  });


});

2 个答案:

答案 0 :(得分:0)

您应使用promise.all等待所有诺言完成。 Promise.all在输入ans等待所有承诺都得到解决之前接受承诺的数组。如果您使用promise.all,那么您的代码将是这样。

result3

答案 1 :(得分:0)

当使用较小的数组时,我的代码似乎运行良好,我真正遇到的问题是处理forEach循环和内存的阻塞性质。我需要遍历的数组超过400,000个单词,并且应用程序在forEach循环完成之前释放了内存,并释放了调用堆栈供httprequest解析。

任何有关如何创建不阻塞调用堆栈的同步forEach循环的信息,将不胜感激。