我是nodejs的新手。我有一個for循環,並嘗試從filearray一次上傳一個文件。對於上傳,它調用一個有承諾模式的方法。因此,for循環將繼續執行而不會等待返回的承諾,因此文件上傳的順序將丟失。任何人都可以幫助我嗎?Nodejs for loop change to同步
function uploadFiles(model, files){
var deferred = Q.defer();
var result = [];
async.eachSeries(files, function(currFiles, callback) {
async.eachSeries(currFiles, function(item, innerCallback) {
var fieldname = item.fieldname;
var tmp_path = item.path;
var _file = fs.readFileSync(tmp_path);
var fileuploaded = parseService.uploadFiles(model, fieldname,item.originalname, { base64 : new Buffer(_file).toString('base64')});
fileuploaded.then(function(data) {
result.push(data).then(function (res){
console.log('File upload success');
innerCallback();
}, function(err){
console.log('File upload fail');
innerCallback();
});
}, function(err) {
if (err) {
return deferred.reject(err);
}
console.log(result);
deferred.resolve(result);
});
}, function() {
callback();
});
return deferred.promise;
});
};
parseService.uploadFiles = function(fieldname, filename, file){
logger.verbose('On uploadFile');
var deferred = Q.defer();
var parseFile = new Parse.File(filename, file);
parseFile.save().then(function() {
return deferred.resolve();},
function(error) {
deferred.reject(err);
});
return deferred.promise;}
這就是我的方法。目前for循環保持運行,文件異步上傳,因此上傳順序錯誤。
避免[deferred antipattern](http://stackoverflow.com/q/23803743/1048572)! – Bergi
你不能使它同步,承諾總是異步的。你是否需要按順序運行上傳文件,或者平行運行也不錯? – Bergi
我想現在順序運行它。因爲當我運行並行(異步)時,上傳順序正在變化 – user3339128