首页 > 解决方案 > 函数不会等到其他函数完成执行

问题描述

问题:
我写了一个函数来判断某个桶是否存在。如果它存在,我会将一些东西上传到我的存储桶中,否则我会创建所述存储桶,然后继续上传我的东西。

但是,我的工作流程遇到了一些麻烦。如果我的桶不存在。该零件//upload my stuff的到达速度比ensureBucketExists()创建我的存储桶的速度要快。

来源: AWS Create S3 Bucket if None Exists
的文档如何测试 AWS S3 上是否存在存储桶

我的代码:

let s3BucketName = 'myBucket';

const s3 = new AWS.S3({
    // Connection 
});

const uploadToS3Bucket = () => {
    ensureBucketExists();
    // upload my stuff...
}

const ensureBucketExists = () => {
    let bucketParams = {
        Bucket: s3BucketName
    };

    s3.headBucket(bucketParams, function(headError) {
        if (!headError) return;

        s3.createBucket(bucketParams, function(createError) {
            if (!createError) console.log(`Created new ${s3BucketName}.`)
        });
    });
};

uploadToS3Bucket();

标签: javascriptnode.jsamazon-s3

解决方案


你的假设asyncawait正确的。作为讲座,我可以向您推荐有关异步编程原理的这一章。

为了实现您的意图,我增强了您的代码:

let s3BucketName = 'myBucket';

const s3 = new AWS.S3({
    // Connection 
});

const uploadToS3Bucket = async () => {
    await ensureBucketExists();
    // upload my stuff... 
}

const ensureBucketExists = async () => {
    let bucketParams = {
       Bucket: s3BucketName
    };

    await s3.headBucket(bucketParams, function(headError) {
        if (!headError) return;

        s3.createBucket(bucketParams, function(createError) {
            if (!createError) console.log(`Created new ${s3BucketName}.`)
        });
    });
};

uploadToS3Bucket();

推荐阅读