Javascript JS中的承诺和回调问题

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

我试图从S3存储桶中获取一个对象列表,当我有一个对象列表时,我希望为这些对象生成预签名URL。我能找到的唯一方法是使用嵌套回调函数,如下所示:

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()调用。你可以提出任何回调风格的异步函数。是的,这就是我最后要做的。