javascript recursion 轉 for loop

本帖最後由 twaiho2003 於 2016-5-19 12:45 編輯

以下係一段node.js code,  原本我寫黎crawl alexa同similarweb, check一堆牌子既rank, 呢到係其中一部分code, 內容大概係loop一個array, array入面有url, 個function係每8秒request 一個url , 唔可以同時request多過一個
因為request係async function, 所以我  recursive咁寫, 有冇可能轉成for loop
因為我最近需要loop個  多重nested 既json.   寫 recursive會變左好累聚


var fs = require('fs')

save_file(0, data_json)

function save_file(x,data_json) {
  var file = fs.createWriteStream("temp/" + data_json[x].filename)

  var options = {
    hostname: data_json[x].hostname,
    port: 80,
    path: data_json[x].path,
    method: 'GET',
  }

  var req = http.request(options, (res) => {
    res.pipe(file)

    res.on('end', () => {
     if (x < data_json.length-1) {
           setTimeout(save_file(x+1,data_json), 8000)
      }
    })
  })

call back時再setTimeout call翻自己, 唔算係recursion喎, 因為都唔會一路stack上去

TOP

回覆 2# KinChungE


    我想轉for loop,  三重nested既時候搞成咁

    res.on('end', () => {
      if (z < data_json[x].series[y].products.length-1) {
        z++
        read_file(x,y,z,data_json)
      } else {
        if (y < data_json[x].series.length-1) {
          z=0
          y++
          read_file(x,y,z,data_json)
        } else {
          if (x < data_json.length-1) {
            z=0
            y=0
            x++
            read_file(x,y,z,data_json)
          }
        }
      }
    })

TOP

回覆  KinChungE


    我想轉for loop,  三重nested既時候搞成咁

    res.on('end', () => {
      if ( ...
twaiho2003 發表於 2016-5-19 12:47


loop做唔到setTimeout呢個效果
你可以考慮用setInterval
自動不停同你call

TOP

回覆 4# KinChungE


    都得,但係一樣要自己reset d x,y,z
setTimeout我之前網上搵到work around,係紀錄一個time,然後不斷check住 current time減返紀錄time夠唔夠8秒,咁樣就做到blocking

差個request 未諗到點block

TOP

TOP

回覆  KinChungE


    都得,但係一樣要自己reset d x,y,z
setTimeout我之前網上搵到work around,係紀錄 ...
twaiho2003 發表於 2016-5-19 13:07


唔好咁做
咁會扯住粒CPU

唔應該用blocking javascript, 應該善用callback

TOP

回覆 6# waichun


    我搵唔到我果種屬於咩pattern

TOP

回覆 7# KinChungE


   以唔浪費CPU既情況下, 我都諗唔到點做

不過原生冇requestSync 就有D奇怪,
因為原生有readFileSync, writeFileSync

TOP

回覆  KinChungE


   以唔浪費CPU既情況下, 我都諗唔到點做

不過原生冇requestSync 就有D奇怪,
因為原 ...
twaiho2003 發表於 2016-5-19 14:17


因為http request fail的話可以好耐先timeout, 冇人會想個program freeze幾分鐘唔郁
另外, 如果個program main thread freeze得太耐, OS可能會同你kill左佢, 結果你行唔到

唔應該為左自己coding方便而不顧performance/efficiency

唔止Node JS, 就算主流web browser都已經未必用到sync既javascript request

TOP