我写了一个像这样工作的函数
onNewZipFileRequested
{get all the necessary data}
.then{download all the files}
.then{create a zipfile with all those file}
.then{upload that zipfile} (*here is the problem)
.than{update the database with the signedUrl of the file}
以下是相关代码
[***CREATION OF ZIP FILE WORKING****]
}).then(() =>{
zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
.pipe(fs.createWriteStream(tempPath))
.on('finish', function () {
console.log("zip written.");
return bucket.upload(tempPath, { //**** problem****
destination: destinazionePath
});
});
}).then(()=>{
const config = {
action:'read',
expires:'03-09-2391'
}
return bucket.file(destinazionePath).getSignedUrl(config)
}).then(risultato=>{
const daSalvare ={
signedUrl: risultato[0],
status : 'fatto',
dataInserimento : zipball.dataInserimento
}
return event.data.ref.set(daSalvare)
})
在客户端,只要应用看到状态更改和新的Url,就会出现下载按钮(指向新网址)
一切正常,但如果我尝试立即下载文件......还没有文件!!!
如果我等待同一时间并重试文件就在那里。
我注意到我必须等待的时间取决于zipfile的大小。
bucket.upload promise应该在上传结束时解决,但显然过早发生。 有没有办法确切知道文件何时准备好? 我可能必须制作同样非常大的文件,如果这个过程需要几分钟,这不是问题,但我需要知道它什么时候结束。
*编辑*
代码中存在不必要的嵌套。虽然这不是错误(重构前后的结果相同),但它在答案中引起了一些混淆,所以我把它编辑出来了。
标识'我想指出我只是在获得签名的网址后才更新数据库,而且只有在上传之后我才能得到它(否则我不能),所以在所有的承诺链上得到任何结果必须工作,事实上它确实如此。当在客户端时出现下载按钮(当状态'成为' fatto'时发生)它已经链接到正确的签名网址,但是如果我太早按下该文件,则该文件是不存在(失败 - 没有文件)。如果我等待一段时间(文件越大,我必须等待的时间越长),那么文件就在那里。
(英语不是我的母语,如果我一直不清楚,我会尝试更好地解释自己)
答案 0 :(得分:3)
看起来问题可能是大括号未正确对齐,导致then
语句嵌入到另一个中。以下是分隔then
语句的代码:
[***CREATION OF ZIP FILE WORKING****]}).then(() => {
zip.generateNodeStream({type: 'nodebuffer', streamFiles: true})
.pipe(fs.createWriteStream(tempPath))
.on('finish', function () {
console.log('zip written.')
return bucket.upload(tempPath, {
destination: destinazionePath
})
})
}).then(() => {
const config = {
action: 'read',
expires: '03-09-2391'
}
return bucket.file(destinazionePath).getSignedUrl(config)
}).then(risultato => {
const daSalvare = {
signedUrl: risultato[0],
status : 'fatto',
dataInserimento : zipball.dataInserimento
}
return event.data.ref.set(daSalvare)
})