[英]Is this the correct way to deal with a JavaScript promise?
请原谅我,但我对 JS 承诺不熟悉。 我认为我需要使用一个与 AWS 服务交互,该服务从 DynamoDB 写入和提取数据。 我有一个 JavaScript 应用程序,它由无服务器 npm 插件运行,它将导出的函数定义为端点。 在 promise 完成后的这些端点中,我需要将数据冒泡备份到端点以将其公开为 JSON 主体。 请参阅下面的代码。
exports.getBlog = async (event) => {
return getBlogPost(event).then((data) => {
console.log("worked", data);
var response = {
statusCode: 200,
body: JSON.stringify(data)
};
return response;
})
.catch((error) => {
console.log("didn't work");
var response = {
statusCode: 400,
body: JSON.stringify(error.toString())
};
return response;
});
}
让我觉得不正确的是我必须创建一个var response
并返回它,然后在exports.getBlog
的根目录之外再次返回。 这是正确的吗? 它使 JSON 打印正确,但是从在线阅读教程中对于这是否是好的做法感到困惑?
如果不是,您将如何从 promise 返回数据并将其公开为 JSON 结果?
在此示例中, exports.getBlog
被无服务器框架引用为端点,如下所示:-
functions:
get-blog:
handler: api/blog.getBlog
events:
- http:
path: api/v1/blog
method: GET
cors: true
你正在混合两者。 这是异步/等待
exports.getBlog = async (event) => {
try {
var res = await getBlogPost(event);
var data = res.data;
console.log("worked", data);
var response = {
statusCode: 200,
body: JSON.stringify(data)
};
return response;
} catch(error) {
console.log("didn't work");
var response = {
statusCode: 400,
body: JSON.stringify(error.toString())
};
return response;
}
}
并且没有
exports.getBlog = event => {
return getBlogPost(event).then((data) => {
console.log("worked", data);
var response = {
statusCode: 200,
body: JSON.stringify(data)
};
return response;
})
.catch((error) => {
console.log("didn't work");
var response = {
statusCode: 400,
body: JSON.stringify(error.toString())
};
return response;
});
}
编辑:添加MDN 关于 async/await 的文章以及如何用它重写 promise 代码
编写 promise 有两种主要方法,首先使用解析和拒绝函数,其次使用.then 和.catch function。
第一个案例示例:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
// reject runs the second function in .then
promise.then(
result => alert(result), // doesn't run
error => alert(error) // shows "Error: Whoops!" after 1 second
);
第二种情况示例:
如果我们只对成功完成感兴趣,那么我们可以只提供一个 function 参数给.then:
let promise = new Promise(resolve => {
setTimeout(() => resolve("done!"), 1000);
});
promise.then(alert); // shows "done!" after 1 second
如果我们只对错误感兴趣,那么我们可以使用 null 作为第一个参数:.then(null, errorHandlingFunction)。 或者我们可以使用.catch(errorHandlingFunction),完全一样:
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
// .catch(f) is the same as promise.then(null, f)
promise.catch(alert); // shows "Error: Whoops!" after 1 second
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.