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

Is this the correct way to deal with a JavaScript promise?

请原谅,我是 JS promises 的新手。我想我需要使用一个来与 AWS 服务交互,该服务写入 DynamoDB 并从中提取数据。我有一个 JavaScript 应用程序,它是无服务器 npm 插件的 运行,它将导出的函数定义为端点。在承诺完成后的这些端点中,我需要将数据冒泡备份到端点以将其公开为 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 和 return 它,然后在 [=14 的根目录之外再次创建 return =].这是正确的吗?它使 JSON 打印正确,但在网上阅读教程时感到困惑,这是否是一种好的做法?

如果不是,您如何 return 来自 promise 的数据并将其公开为 JSON 结果?

在此示例中,exports.getBlog 被无服务器框架引用为端点,如下所示:-

functions:
  get-blog:
    handler: api/blog.getBlog
    events:
      - http:
          path: api/v1/blog
          method: GET
          cors: true

你把两者混在一起了。这是 async/await

 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

编辑:在 async/await 上添加 MDN's article 以及如何用它重写承诺代码

编写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