为了账号安全,请及时绑定邮箱和手机立即绑定

这是处理 JavaScript 承诺的正确方法吗?

这是处理 JavaScript 承诺的正确方法吗?

慕少森 2022-06-16 14:41:39
请原谅我,但我对 JS 承诺不熟悉。我认为我需要使用一个与 AWS 服务交互,该服务从 DynamoDB 写入和提取数据。我有一个由无服务器 npm 插件运行的 JavaScript 应用程序,它将导出的函数定义为端点。在 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;    });}让我觉得不正确的是我必须创建 avar 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
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

你正在混合两者。这是异步/等待


 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;

});

}

好读:https ://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9


编辑:添加MDN关于 async/await 的文章以及如何用它重写 promise 代码


查看完整回答
反对 回复 2022-06-16
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

编写 promise 有两种主要方法,首先使用 resolve 和 reject 函数,其次使用 .then 和 .catch 函数。


第一个案例示例:


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

);

第二种情况示例:


如果我们只对成功完成感兴趣,那么我们可以只为 .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


查看完整回答
反对 回复 2022-06-16
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信