使用await和async关键字开发nodejs应用批量取出简书网站的文章标题和超链接

版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://blog.csdn.net/i042416/article/details/89311017

ES6的await和async出来已经那么久了,一起来学习一下吧。

还是用我之前的读取某个简书用户所有文章列表的例子。

先看主函数框架:

async function downloadArticle(pageNumber){
  var url = PAGE + pageNumber;
  console.log("current page: " + url);
  var pageOptions = {
        url: url,
        method: "GET",
        headers: {
            "Accept": "text/html"
        }
  };

  try{
    var downloadedPage = await getArticles(pageOptions, pageNumber);
    console.log('downloaded Page number: ' + downloadedPage);
  }
  catch(error){
    console.error(error);
  }
}

async用来表示函数是异步的,定义的函数会返回一个promise对象,可以使用then方法添加回调函数。

而await 可以理解为是 async wait 的简写。await 必须出现在 async 函数内部,不能单独使用。我这里的await后面带的getArticles,其实是一个promise包裹的nodejs request module调用,源代码如下:

function getArticles(pageOptions, pageNumber) {
  return new Promise(function(resolve,reject){
      var requestC = request.defaults({jar: true});

      requestC(pageOptions,function(error,response,body){
        if( error){
          console.log("error: " + error);
          resolve(error);
        }
        var document = new JSDOM(body).window.document;
        var content = document.getElementsByTagName("li");

        for( var i =0; i < content.length; i++){
          var li = content[i];
          var children = li.childNodes;
          for( var j = 0; j < children.length; j++){
              var eachChild = children[j];
              if( eachChild.nodeName == "DIV"){
                var grandChild = eachChild.childNodes;
                for( var k = 0; k < grandChild.length; k++){
                  var grand = grandChild[k];
                  if( grand.nodeName == "A"){
                    var fragment = grand.getAttribute("href");
                    if( fragment.indexOf("/p") < 0)
                      continue;
                    console.log("title: " + grand.text);
                    var wholeURL = PREFIX + fragment;
                    console.log("url: " + wholeURL);
                    if( mArticleResult.has(grand.text)){
                      lastPageReached = true;
                      console.log("article size: " + mArticleResult.size);
                      resolve(pageNumber);
                    }
                    mArticleResult.set(grand.text, wholeURL);
                  }
                }
              }
          }
        }// end of outer loop
        resolve(pageNumber);
      }); 
     });
}

在nodejs里执行上面这段代码,输出:

[图片]

clipboard1

猜你喜欢

转载自blog.csdn.net/i042416/article/details/89311017
今日推荐