2016-02-26 148 views
-1

我有一個for循環後調用一個動作fs.copy。之後for循環完成我需要執行一個命令。我想我需要做一個回調,一旦完成。我想我遇到的問題是fs.copy運行異步,所以for循環實際上在fs.copy動作完成之前完成。建議?執行FOR循環後,FS行動

var sessionNumeber = 7; 
photoOrder = (An array of photo names); 
for(var i = photoOrder.length - 1; i >= 0; i--) { 
    console.log('Moving Photo'); 
    fs.copy(cfg.watchedFolder+photoOrder[i]+'.jpg', cfg.outputFolder+sessionNumber+"/"+i+'.jpg', function (err) { 
     if (err) { 
      // i.e. file already exists or can't write to directory 
      throw err; 
     } 
    }); 
}); 
nextCommand(); 
+0

請格式化你的代碼 – Oleander

+0

代碼已更新 –

+0

爲照片添加計數器,當它將等於數組長度時 - 調用您的函數 – loadaverage

回答

1

因爲for循環不是異步但copy是,這樣你就不能使用for循環throught異步功能。解決方案是使用async庫。

https://github.com/caolan/async

async.map(ARR,iteratee,[回調])

例如,你可以嘗試:

async.map(photoOrder, function (photo, callback) { 
    console.log('Moving Photo'); 
    fs.copy(cfg.watchedFolder + photo + '.jpg', cfg.outputFolder + sessionNumber + "/" + i + '.jpg', function (err) { 
     if (err) { 
      // i.e. file already exists or can't write to directory 
      callback(err); 
     } 
    }); 
}, function (err, results) { 

    nextCommand(); 
}); 
+0

它似乎正在運行nextCommand();在每次迭代之後而不是在一切完成之後。思考? –

+0

否,最後一個函數在全部完成時運行。更多信息:https://github.com/caolan/async#map – Kelvin

+0

啊,它看起來像你的代碼中的一個錯字,缺少「})」before「},function(err,results){」如果你想修復它,我可以標記爲正確。 –