首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS承诺等待foreach循环的完成

NodeJS承诺等待foreach循环的完成
EN

Stack Overflow用户
提问于 2016-12-05 20:58:20
回答 1查看 848关注 0票数 0

我有一个NodeJS脚本,它为用户调用API,为每个用户获取多个数据并将其全部写入本地文件。一旦所有的数据都写入到文件中,我将尝试将该文件上传到服务器。问题是,在文件完全填充之前,应该上载文件的代码就会被执行。代码写在下面。我不知道如何做出承诺,等待第一个功能完成。

代码语言:javascript
复制
var fs = require('fs');
var server = require('some-server');
var service = require('./some-service.js');
var moment = require('moment-timezone');
var csvWriter = require('csv-write-stream');
var writer = csvWriter({
sendHeaders: false
});

var users = require('./some-users')
writer.pipe(fs.createWriteStream('myFile' + '.txt'))

service.login().then(function (response) {

users.forEach(function (user) {

    service.getSpecificUser(user).then(function (response) {

        var myUser = JSON.parse(response)
        service.getDataForUser(user.Info).then(function (response) {
            var userData = JSON.parse(response);
            if (userData.IsValid) {
                userData.AdditionalInfo.forEach(function (additionalInfo) {
                    service.getAdditionalInfo(myUser.Info, userData.data).then(function (response) {

                        //Collect additional info and combine final results to write into file
                        // write to output csv file
                        writer.write({
                            //write information that is of interest
                        })

                    }, function (error) {
                        console.log('error getting additional data', error);
                    })
                }
                )
            }
        }, function (error) {
            console.log('error getting user data', error)
        })
    }, function (error) {
        console.log('error', myUser, error)
    })
});
}, function (error) {
 console.log('not logged', response);
}).then(function () {
//perform uploading to server
var fpath = 'path of file that contains downloaded data'
console.log("Trying to upload to file: " +fpath)
service.UploadFile(fpath, function (error, result, response) {
    if (!error) {
        console.log("Uploaded " + name);
    }
    else {
        console.log(error);
    }

})
})

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-05 22:17:35

你可以用Promise.all()Array.prototytpe.map()代替.forEach()csv-write-steam的文档似乎使用.end()来完成对.write()的最后.then()调用。

代码语言:javascript
复制
  service.login().then(function(response) {
    return Promise.all(users.map(function(user) {
      return service.getSpecificUser(user).then(function(response) {
        var myUser = JSON.parse(response)
        return service.getDataForUser(user.Info).then(function(response) {
          var userData = JSON.parse(response);
          if (userData.IsValid) {
            return Promise.all(userData.AdditionalInfo.map(function(additionalInfo) {
              return service.getAdditionalInfo(myUser.Info, userData.data).then(function(response) {
                //Collect additional info and combine final results to write into file
                // write to output csv file
                writer.write({
                  //write information that is of interest
                });
              })
            }))
          }
        })
      })
    }));
  })
  .then(function() {
   writer.end();
    //perform uploading to server
    var fpath = 'path of file that contains downloaded data'
    console.log("Trying to upload to file: " + fpath)
    service.UploadFile(fpath, function(error, result, response) {
      if (!error) {
        console.log("Uploaded " + name);
      } else {
        console.log(error);
      }

    })
  })
  .catch(function(e) {
    console.log(e)
  })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40983201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档