javascript回調地獄真的只能Promise來解決嗎?js回調地獄,Promise。


javascript的靈活在於函數可以當作函數的參數來傳遞,以及它的異步回調思想。但是這就帶了一個很嚴重的問題,那就是回調次數過多,會影響代碼結構,多層嵌套影響代碼的可閱讀性,也不便於書寫。

舉個例子,用nodejs寫爬蟲,如果要爬取4個頁面,並且要求爬取完上一個在爬取下一個,那么代碼就得這樣書寫:

var http=require('http')

var url_arr=['http://www.cnblogs.com/wl843022618/p/6767066.html',

         'http://www.cnblogs.com/wl843022618/p/6422970.html',

         'http://www.cnblogs.com/wl843022618/p/6422755.html',

         'http://www.cnblogs.com/wl843022618/p/6375052.html']

http.get(url_arr[0],function(res){

  res.on('data',function(){

           ......

     })

  res.on('end',function(){

       http.get(url_arr[1],function(res){

         res.on('data',function(){

                ......  

        })

        res.on('end',function(){

           http.get(url_arr[2],function().............

        })

     })

  })

})

其中我省略了許多行,也許有些朋友看不懂這個代碼,沒關系,我用request寫一遍,如下:

var request=require('request')

var url_arr=['http://www.cnblogs.com/wl843022618/p/6767066.html',

         'http://www.cnblogs.com/wl843022618/p/6422970.html',

         'http://www.cnblogs.com/wl843022618/p/6422755.html',

         'http://www.cnblogs.com/wl843022618/p/6375052.html']

request(url_arr[0],function(err,response,body){

  request(url_arr[1],function(err,response,body){

    request(url_arr[2],function(err,response,body){

      request(url_arr[3],function(err,response,body){

    

       })

     })

   })

})

4層嵌套,沒帶爬取后的處理,還算清晰,那如果是100次嵌套,請問你怕不怕,我反正是怕了,當然了我剛遇到這問題的時候一臉懵逼,后來知道了Promise感覺好像解決了這個問題,但是並不完美:用Promise封裝了request之后,代碼會如下:

promise_request(url_arr[0])

  .then(function(){})

  .then(function(){})

  ......

依然沒有簡化代碼,只是讓代碼看起來能看懂代碼的處理流程,但是我有不一樣的解決辦法,那就是遞歸寫法:

很簡單:

var request=require('request')

var i==0

request(url_arr[0],function callback(err,response,body){

  if(i==url_arr.length){

    return

  }

  i++

  request(url_arr[i],callback)

})

再次簡化:

var request=require('request')

request(url_arr.shift(),function callback(err,response,body){

  //....爬取后的處理寫在這里

  if(0==url_arr.length){

    return

  }

  request(url_arr[i],callback)

})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM