求大神解答 : for loop 還沒執行所有項目就退出 loop
发布于 19天前 作者 NitroXenon 189 次浏览 来自 问答

各位大神好 我是 node 新手 最近才接觸 node 發現事件驅動十分強大… 剛剛寫了一個從服務器拿取資料的for loop lastChunk 是 3 但是最後 loop 結束後,只寫入了一個檔案 : chunk-3 其他的 chunk-1 和 chunk-2 沒有 request 到 有大神知道怎樣讓 for loop 執行所有 chunk 才會退出回圈? 求解 以下是code

          for (var i = 1; i < lastChunk; i++ ) {  // Start of for loop
            request(server + 'getGameDataChunk/' + platform + '/' + id + '/' + i + '/token', function(err, res, body) {
                if (err)
                  console.log(err.message);
                fs.writeFile(folder + '/chunk-' + i,body,function(err){
                  if (err)
                    console.log(err.message);
                    // 其他操作
                });
            });
          } // End of for loop
12 回复

先去了解下异步吧。

@NitroXenon 不是async模块,而是node的异步的原理。

@JacksonTian 那解決方法是不是在for loop裏面回傳callback?

for是同步逻辑,不要这样处理异步io,你在callback中用到的i都是i的最大值,可以自己写一个递归调用,在callback里调用

function asyncIO(index) {
    if (index>3) return;
    io('file'+index, function() {
        index++;
        asyncIO(index);
    });
}

顺便帮忙推荐一下《深入浅出nodejs》

@NitroXenon 这样的话,callback里取到的都是for loop结束时i的值了,不用引入其他模块的话,可以在作用域内维护一个计数器,for loop里的callback里取计数器的值,每次再把计数器+1

受教了 感覺在node用for很麻煩:/

@NitroXenon 是异步调用在for loop中很麻烦。想让触发多次异步调用的话,还是多用流程控制模块如async吧 :)

@DavidCai1993 感謝大神建議~ 正打算用async :)

@DavidCai1993 用async的each貌似可以xD

回到顶部