我需要每个下载和getFiles调用分开运行,因为firebase似乎无法处理太多的连接。Node.JS:为什么嵌套promise应用程序似乎无序运行?
const bucket = storage.bucket(bucketName); // firebase storage bucket
var queue = Promise.resolve();
websiteNames.reduce(function(promise, websiteName) {
return promise
.then(() => {
mkdirp(websiteName)
})
.then(() => {
console.log("now getting files: " + dirPath);
return bucket.getFiles({prefix: dirPath})
})
.then(data => {
console.log("got files");
var files = data[0];
files.forEach(function (file) {
var storePath = tmpDir + "/" + file.name;
queue = queue
.then(() => {
console.log("now downloading: " + file.name);
return file.download({destination: storePath});
})
.then(() => {
console.log(`downloaded to ${storePath}.`);
return readFile(storePath, 'utf8');
})
.then(buffer => {
console.log("readed file: " + storePath + " of buf size " + buffer.length);
});
});
});
}, queue);
我预计big then block会将下载动作添加到已经拥有所有getFiles动作的队列中。所以我希望它在开始下载文件之前完成所有的getFiles调用。但是,控制台日志是这样的:
now getting files: foo/a
got files
now downloading: foo/a/0.csv
now getting files: foo/b
got files
now getting files: foo/c
got files
downloaded to /tmp/foo/a/0.csv.
为什么富/ A/0.csv开始下载所有的桶的GetFiles调用才制成?在已经有getFiles thens之后,是否不应该将文件下载的thens文件添加到队列末尾?而且,foo/a有多个文件,为什么只有一个文件下载在getFiles调用之间?
你是在误解诺言。您遍历您的网站名称并将处理程序附加到您的承诺。无论先发生什么,它们将被异步执行。 虽然有Promise队列的js插件。 – Strernd