这是处理 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;
});
}
编辑:在 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
请原谅,我是 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;
});
}
编辑:在 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