【发布时间】:2020-04-19 19:19:24
【问题描述】:
我有一个 NodeJS 脚本,它为用户调用 API,为每个用户获取多个数据并将其全部写入本地文件。将所有数据写入文件后,我正在尝试将该文件上传到服务器。问题是应该上传文件的代码在文件完全填充之前被执行。代码写在下面。我不知道如何让 promise 等待第一个函数完成。
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);
}
})
})
任何帮助将不胜感激。
【问题讨论】:
-
javascript的哪一部分应该最后调用?writer.write()有回调,还是返回Promise? -
@guest271314 last函数需要上传文件到服务器,需要最后调用
-
您的
.then回调没有返回任何内容,因此它们会在调用后立即解析(未定义)。正如 Bergi 指出的那样,带有 Promises 的 .forEach 没有什么意义 - 不确定您不能将 .forEach 与 Promises 一起使用的陈述,因为可以,您只需要编写比使用更复杂的代码.map和Promise.all例如 - 或者使用像 bluebird 这样的库,它有Promise.map这是 Array#map + Promise.all 的糖 -
如果您要捕获/记录中间错误,请不要忘记重新抛出它们,否则承诺链将(尝试)沿着其成功路径前进。
标签: javascript node.js callback promise