javascript - Nodejs for 循环更改为同步

标签 javascript node.js callback promise q

我是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/

相关文章:

javascript - 使用 Backbone 四处走动

javascript - 通过 JS 或 PHP 从新的 youtube 2015 下载视频

javascript - thickbox javascript 函数

node.js - Nodejs fork 子进程立即退出,状态码为 8

javascript - 托管多个 Node.JS 应用程序,使用代理服务器识别子域

node.js - typescript 忽略 NODE_PATH 变量

javascript - 试图理解回调函数

c++ - 在 C++ 中分配回调函数

c - 我正在学习 "Function callback"并且我的代码中出现了段错误?

javascript - 带回调的 useEffect 不更新状态