Hello Im链接有希望,但即时获取的结果不是Im期望的
下面的代码:
createFile(event.body)
.then(() => readFile())
.then((data) => uploadToS3(data))
.then(() => deleteTmp())
.catch(err => console.log(err));
和功能:
async function createFile(fileBinary) {
return await fs.writeFile(TMP_FILE, fileBinary, 'binary', (err) => {
if (err) {
throw {error: 'File upload error_stage1'}
}
return;
});
}
async function readFile() {
return await (fs.readFile(TMP_FILE, (err, data) => {
if (err) {
console.log(err)
throw {error: 'File upload error_stage2'}
}
console.log('read file')
return data;
}));
}
async function uploadToS3(data) {
console.log('upload s3')
const uploadParams = {Bucket: myBucket, Key: myKey, Body: data};
return await s3.putObject(uploadParams, function (err, data) {
if (err) {
throw {error: 'File upload error_stage3'}
}
return data;
});
}
async function deleteTmp() {
fs.unlink(TMP_FILE, (err) => {
if (err) {
throw {error: 'File upload error_stage3'}
}
})
}
console.logs:
upload s3
read file
因此,从控制台日志中我们可以看到,函数uploads3在读取文件之前被执行,这与链顺序相反。我在这里想念什么?
答案 0 :(得分:2)
ReadFile似乎正在返回一个诺言,稍后将执行该请求,而uploadToS3不返回一个诺言,因此它将在调用中执行。
我没有设置测试环境,但是也许您想执行以下操作:
=SUMIF($A:$A,$B14,BD:BD)
答案 1 :(得分:1)
您的readFile
函数返回一个Promise,无需等待文件被读取即可解决,这是因为您使用过Promise.resolve()
您需要返回一个新的Promise,在读取文件后即可解决。 例如:
function readFile() {
return new Promise((resolve, reject) => {
fs.readFile(TMP_FILE, (err, data) => {
if (err) {
console.log(err)
throw {error: 'File upload error_stage2'}
}
console.log('read file')
resolve(data);
})
})
}
在uploadToS3
中,您有这个return await s2.putObject....
,因为s3.putObject
不返回承诺,所以它不起作用。您必须执行类似的操作才能等待文件上传:
function uploadToS3(data) {
const uploadParams = {Bucket: myBucket, Key: myKey, Body: data};
return new Promise((resolve, reject) => {
s3.putObject(uploadParams, function (err, data) {
if (err) {
throw {error: 'File upload error_stage3'}
}
resolve(data);
})
});
}
答案 2 :(得分:0)
好像您正在将对返回Promises的函数的链接调用与异步函数混在一起。
粘在另一个上,你应该没事。
A:使所有功能异步,然后简单地依次调用它们
或
B:让所有函数都返回Promises