javascript - 使用 AWS SDK 时,Promise 中的后续 .then() 不会等待之前的 .then() 完成
问题描述
我在 JS 世界里太天真了。为什么我的 Javascript Promise 没有按预期工作?我想在完成console.log("update configs");
之前不会被执行console.log("checking bucket");
。提前感谢您的帮助。
注意:“检查桶”功能每隔几秒就会持续检查 S3 桶,直到创建 S3 桶。
process.env.AWS_PROFILE = 'aquarius';
process.env.AWS_SDK_LOAD_CONFIG = 'true';
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
// Create S3 service object
s3 = new AWS.S3({apiVersion: '2006-03-01'});
let bucketName = "mybucket.test.com"
// Create S3 service object
var s3 = new AWS.S3({
apiVersion: '2006-03-01'
});
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('hello world');
}, 1);
});
promise.then(function(data) {
var params = {
Bucket: bucketName,
ACL: "public-read"
};
s3.createBucket(params, function(err, data) {
console.log("creating bucket");
if (err) {
console.log(err, err.stack); // an error occurred
} else {
console.log(data); // successful
}
});
})
.then(function(data) {
console.log("checking bucket");
var params = {
Bucket: bucketName
};
s3.waitFor('bucketExists', params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log("bucket exist"); // successful response
});
})
.then(function(data) {
console.log("update configs");
var params2 = {
Bucket: bucketName,
ContentMD5: "",
WebsiteConfiguration: {
ErrorDocument: {
Key: "error.html"
},
IndexDocument: {
Suffix: "index.html"
}
}
};
s3.putBucketWebsite(params2, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful
});
});
解决方案
感谢大家的反馈和提示。我发现我可以直接从 AWS SDK 函数中检索 Promise 对象。这是现在正在工作的修改后的代码。
// Create S3 service object
var s3 = new AWS.S3({
apiVersion: '2006-03-01'
});
var params = {
Bucket: bucketName,
ACL: "public-read"
};
var promiseObject = s3.createBucket(params, function(err, data) {
console.log("creating bucket");
if (err) {
console.log(err, err.stack); // an error occurred
} else {
console.log(data); // successful
}
}).promise(); // <=== THIS LINE SAVED MY DAY !!
promiseObject.then(function(data) {
console.log("checking bucket");
var params = {
Bucket: bucketName
};
s3.waitFor('bucketExists', params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log("bucket exist"); // successful response
});
})
.then(function(data) {
console.log("update configs");
var params2 = {
Bucket: bucketName,
ContentMD5: "",
WebsiteConfiguration: {
ErrorDocument: {
Key: "error.html"
},
IndexDocument: {
Suffix: "index.html"
}
}
};
s3.putBucketWebsite(params2, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful
});
})
推荐阅读
- postgresql - 生产环境中的 DOCKER 环境
- vba - 为什么当我尝试使用 VBA 运行循环时,味精框不起作用
- java - 如何在容器化 Jenkins 中使用主机系统中的 JDK 11 构建 Spring Boot 2
- javascript - 对数组的每个项目进行 api 调用
- javascript - 使用 discord.js 在文本中提及名字
- python - 使用python循环从binance获取更多数据
- amazon-redshift - Access denied to S3 when using COPY command with IAM role
- javascript - 为什么 IDBKeyRange.upperBound 在 Firefox 中不起作用?
- sql-server - NULL 是必要的吗?
- testing - 错误错误:找不到模块'testcafe-hammerhead'