【发布时间】:2020-06-11 16:16:30
【问题描述】:
我正在编写一些循环遍历 CSV 并创建 JSON 文件 based on the CSV 的代码。 JSON 中包含一个名为photos 的array,它包含函数内上传到Google Cloud Storage 的图像的返回url。但是,承诺等待上传完成让我很困惑,因为一切都是异步运行的,并且在完成存储桶上传并返回 url 之前完成了 promise 和 JSON 编译。在检索到 URL 并将其添加到 currentJSON.photos 后,如何使 promise 解析?
const csv=require('csvtojson')
const fs = require('fs');
const {Storage} = require('@google-cloud/storage');
var serviceAccount = require("./my-firebase-storage-spot.json");
const testFolder = './Images/';
var csvFilePath = './Inventory.csv';
var dirArr = ['./Images/Subdirectory-A','./Images/Subdirectory-B','./Images/Subdirectory-C'];
var allData = [];
csv()
.fromFile(csvFilePath)
.subscribe((json)=>{
return new Promise((resolve,reject)=>{
for (var i in dirArr ) {
if (json['Name'] == dirArr[i]) {
var currentJSON = {
"photos" : [],
};
fs.readdir(testFolder+json['Name'], (err, files) => {
files.forEach(file => {
if (file.match(/.(jpg|jpeg|png|gif)$/i)){
var imgName = testFolder + json['Name'] + '/' + file;
bucket.upload(imgName, function (err, file) {
if (err) throw new Error(err);
//returned uploaded img address is found at file.metadata.mediaLink
currentJSON.photos.push(file.metadata.mediaLink);
});
}else {
//do nothing
}
});
});
allData.push(currentJSON);
}
}
resolve();
})
},onError,onComplete);
function onError() {
// console.log(err)
}
function onComplete() {
console.log('finito');
}
我尝试过移动resolve(),还尝试将上传器部分放入onComplete() 函数中(这会产生新的基于promise 的问题)。
【问题讨论】:
-
bucket.upload是异步的吗? -
@MattOestreich 不,但有一些方法可以异步stackoverflow.com/questions/54095155/…
-
该链接概述了
bucket.upload是异步的方式。他们只是在展示如何正确处理在循环中使用它-但是,这就是为什么会发生这种情况-您在循环中使用异步方法..按照那篇文章,使用 Promise.all 很好处理这个问题的方法。 -
您可以添加
import语句来解决您在代码中的依赖关系吗? (fs, csv) -
@trincot 繁荣...
标签: javascript node.js promise google-cloud-storage es6-promise