Tom*_*ley 1 javascript promise aws-sdk
我在噩梦中试图束缚aws js sdk。当前,我有以下内容(省略了删除谷壳的任何参数,这些调用独立运行,因此可以放心地假设它们是正确的)
function deploy() {
return sts.assumeRole().promise()
.then(() => {
return new Promise((resolve, reject) => {
return new Promise((resolve, reject) => {
AWS.config.update({
credentials: {
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken
}
});
resolve();
})
.then(() => {
fsPromise.readFile(packageLocation).then(() => {
return s3.upload().promise();
});
});
}).then(() => {
return ebs.createApplicationVersion().promise();
}).then(() => {
return ebs.createEnvironment().promise();
});
};
Run Code Online (Sandbox Code Playgroud)
如果我then按顺序逐个运行,但是当我一起运行它们时,createApplicationVersion调用将失败,因为upload尚未运行,原因是它试图在assumeRole完成之前尝试上传。我假设...
我显然做错了,但是我不清楚是什么。
诺言的使用比必要的要复杂得多。请记住,then(和catch和finally)返回根据其处理程序返回的值结算的新的Promise。new Promise内的then(或catch或finally)处理程序是几乎从未必要的; 只需返回您将用(一个值或另一个承诺)解决该承诺的任何内容,然后由thenet。返回该承诺。等 将解决它。
如果我假设AWS.config.update()是同步的,则该链应如下所示:
function deploy() {
return sts.assumeRole().promise()
.then(() => {
AWS.config.update();
})
.then(() => fsPromise.readFile(packageLocation))
.then(() => s3.upload().promise())
.then(() => ebs.createApplicationVersion().promise())
.then(() => ebs.createEnvironment().promise());
}
Run Code Online (Sandbox Code Playgroud)
该链中的每个步骤都将等待上一步完成。
如果您不想deploy使用的实现值来实现其诺言ebs.createEnvironment().promise(),则添加一个最终then处理程序:
.then(() => ebs.createEnvironment().promise())
.then(() => { });
}
Run Code Online (Sandbox Code Playgroud)
(我假设您要在以下示例中执行此操作。)
还是这样,如果AWS.config.update()是异步的并返回一个Promise:
function deploy() {
return sts.assumeRole().promise()
.then(() => AWS.config.update())
.then(() => fsPromise.readFile(packageLocation))
.then(() => s3.upload().promise())
.then(() => ebs.createApplicationVersion().promise())
.then(() => ebs.createEnvironment().promise())
.then(() => { });
}
Run Code Online (Sandbox Code Playgroud)
或者,当然,在任何相对较新的Node.js版本中(我只是从fsPromise一般上下文中猜测这就是Node.js),您可以使用以下async函数:
async function deploy() {
await sts.assumeRole().promise();
await AWS.config.update(); // Or without `await` if it is synchronous and doesn't return a promise
await fsPromise.readFile(packageLocation);
await s3.upload().promise();
await ebs.createApplicationVersion().promise();
await ebs.createEnvironment().promise();
}
Run Code Online (Sandbox Code Playgroud)
有关此代码以及您在注释中发布的类似代码的旁注:
return new Promise((resolve, reject) => {
AWS.config.update({
credentials: {
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken
}
});
resolve();
})
Run Code Online (Sandbox Code Playgroud)
没有理由在new Promise那里使用。它不会将调用AWS.config.update转换为异步调用或类似的调用。如果出于某种原因您需要在那里的承诺(在这种情况下您不需要AKAICT),则可以使用Promise.resolve:
AWS.config.update(/*...*/);
return Promise.resolve();
Run Code Online (Sandbox Code Playgroud)
但是同样,这里不需要。请记住,promise仅提供一种观察异步过程结果的方法,它们不会使过程异步。(他们实际上使异步唯一的事情就是观察结果。)
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |