繁体   English   中英

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

[英]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;
});
}

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

编辑:添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM