首页 文章

Node.js异步/等待无法正常工作

提问于
浏览
1

我是韩国人,我不会说英语,所以我要求你理解 .

我正在创建带有搜索词和页码并抓取它的代码 .

let promises = []; //promise save
let totalData = []; //final data

let makeRequest = function(url) { 
  return new Promise((resolve, reject) => {
    request(url, function(err, response, body){
      if(body == null) { return reject('fail'); }

      const $ = cheerio.load(body);
      let parsingData = $('.g .r a');
      console.log(parsingData);

      for(let i = 0; i < parsingData.length; i++){
          totalData.push(parsingData[i]);
      }

      return resolve('success');
    });
  });
}

//promises push
for(let i = 0; i < pageCount; i++){
  let url = `https://google.com/search?q=${ searchWord }&start=${i}0`
  promises.push(makeRequest(url));
}


(async function(){
  try{
    await Promise.all(promises);   
    console.log(totalData); 
    return res.json(true);
  }
  catch(error){
    console.log(error);
    return res.json(false);
  }
});

我已经确认所有承诺都会从挂起变为已解决 .

enter image description here

enter image description here

我还注意到我导入爬行的数据是正常的 .

enter image description here

但我不知道为什么异步和等待不起作用 . console.log(totalData);不执行 .

1 回答

  • 1

    这部分:

    (async function(){
      try{
        await Promise.all(promises);   
        console.log(totalData); 
        return res.json(true);
      }
      catch(error){
        console.log(error);
        return res.json(false);
      }
    });
    

    看起来好像你正在尝试创建一个IIFE,但是在这种情况下你创建了一个匿名函数,但你没有调用它 . 因此该函数中的所有代码都不会执行 . 您需要在其末尾添加一组额外的括号来调用该函数:

    (async function(){
      try{
        await Promise.all(promises);   
        console.log(totalData); 
        return res.json(true);
      }
      catch(error){
        console.log(error);
        return res.json(false);
      }
    })(); // <-- note the extra () here
    

相关问题