Javascript JS中的承诺和回调问题
我试图从S3存储桶中获取一个对象列表,当我有一个对象列表时,我希望为这些对象生成预签名URL。我能找到的唯一方法是使用嵌套回调函数,如下所示:Javascript JS中的承诺和回调问题,javascript,node.js,amazon-web-services,amazon-s3,promise,Javascript,Node.js,Amazon Web Services,Amazon S3,Promise,我试图从S3存储桶中获取一个对象列表,当我有一个对象列表时,我希望为这些对象生成预签名URL。我能找到的唯一方法是使用嵌套回调函数,如下所示: exports.handler = async (event, context, callback) => { console.log('processing event: %j', event); const bucket = process.env['s3_bucket']; if (!bucket) { callback(new E
exports.handler = async (event, context, callback) => {
console.log('processing event: %j', event);
const bucket = process.env['s3_bucket'];
if (!bucket) {
callback(new Error("s3 bucket not set"));
}
const deviceId = event['deviceId'];
const params = getListObjectsParams(deviceId, bucket);
let count = 0;
await s3.listObjectsV2(params, function (err, data) {
if (err) callback("Error getting image list: " + err);
else {
data.Contents.forEach(function (image) {
count = count + 1;
const objectParams = getObjectParams(bucket, image.Key);
s3.getSignedUrl('getObject', objectParams, function (err, url) {
if (err) {
console.log("Error");
console.log(err);
//TODO: log error getting pre signed url
} else {
images.push(url);
}
});
});
}
});
callback(null, images);
})
由于函数在调用listObjectsV2和每个getSignedUrl之前完成,因此返回images数组时遇到一些问题。以下是我的问题
async
函数中,将wait
放在承诺前面
您已经完成了前两个步骤,但是s3.listObjectsV2
不会返回承诺
如果要使用wait
,则必须
在完成函数执行之前,如何让执行等待承诺完成
在async
函数中,将wait
放在承诺前面
您已经完成了前两个步骤,但是s3.listObjectsV2
不会返回承诺
如果要使用
wait
,则必须AWS JavaScript SDK本机支持Promissions。而不是:
s3.listObjectsV2(params, function (err, data) {
// do something with data here in the callback
});
写下:
const data = await s3.listObjectsV2(params).promise();
// do something with data here
请注意,await
只能用于async
函数。如果您不在async函数中,则可以按如下方式制作一个函数(立即调用的async arrow函数):
AWS JavaScript SDK本机支持承诺。而不是:
s3.listObjectsV2(params, function (err, data) {
// do something with data here in the callback
});
写下:
const data = await s3.listObjectsV2(params).promise();
// do something with data here
请注意,await
只能用于async
函数。如果您不在async函数中,则可以按如下方式制作一个函数(立即调用的async arrow函数):
您的代码显示了普通回调的使用,并指示根本不使用承诺。您的代码显示了普通回调的使用,并指示根本不使用承诺。感谢您提供listObjectsV2的.promise()提示。这非常有用。结果是,它们没有对getSignedUrls()的.promise()调用你可以提出任何回调风格的异步函数。是的,这就是我最后要做的。谢谢你为listObjectsV2提供的关于.promise()的提示。这非常有用。事实证明他们没有对getSignedUrls()的.promise()调用。你可以提出任何回调风格的异步函数。是的,这就是我最后要做的。