我是nodejs新手。我有一个 for 循环,它尝试从文件数组一次上传一个文件。对于上传,它调用具有 promise 模式的方法。因此,for 循环会继续执行,而不等待返回 Promise,因此文件上传的顺序会丢失。谁能帮我解决这个问题吗?
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 循环仍在运行,文件正在异步上传,因此上传顺序错误。
最佳答案
我使用 babel 和 async/await 来简化这个过程。一旦你的函数返回了 Promise,你就可以做这样的事情:
import readFile from 'fs-readfile-promise';
async function upload(files) {
const results = [];
for (let fname of files) {
let file = await readFile(fname, 'utf8');
let parsed = await parse(file);
results.push(parsed);
}
return results;
}
另外,这只是一个附带问题,但命名很困惑,因为您的 uploadFiles 解析文件而不是上传它们(看起来)。确保名称有意义。
关于javascript - Nodejs for 循环更改为同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39237310/