Return 来自 AWS Javascript SDK 回调函数的值
Return value from callback function in AWS Javascript SDK
我正在使用 AWS Javascript SDK,并且正在按照有关如何发送 SQS 消息的教程进行操作。我基本上遵循 AWS tutorial,其中有一个 sendMessage
的示例,如下所示:
sqs.sendMessage(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data.MessageId);
}
});
所以sendMessage
函数使用了一个回调函数来输出操作是否成功。我不想打印到控制台,而是想 return 一个变量,但是我设置的每个值都只在回调函数中可见,甚至像 window.result
这样的全局变量在回调函数之外也不可见。有没有办法在回调之外 return 值?
目前我发现的唯一解决方法是在 HTML 元素中设置数据属性,但我认为这不是真正优雅的解决方案。
我建议在 ES2016 中使用 Promises
和新的 async
和 await
关键字。它使您的代码更易于阅读。
async function sendMessage(message) {
return new Promise((resolve, reject) => {
// TODO be sure SQS client is initialized
// TODO set your params correctly
const params = {
payload : message
};
sqs.sendMessage(params, (err, data) => {
if (err) {
console.log("Error when calling SQS");
console.log(err, err.stack); // an error occurred
reject(err);
} else {
resolve(data);
}
});
});
}
// calling the above and getting the result is now as simple as :
const result = await sendMessage("Hello World");
我正在使用 AWS Javascript SDK,并且正在按照有关如何发送 SQS 消息的教程进行操作。我基本上遵循 AWS tutorial,其中有一个 sendMessage
的示例,如下所示:
sqs.sendMessage(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data.MessageId);
}
});
所以sendMessage
函数使用了一个回调函数来输出操作是否成功。我不想打印到控制台,而是想 return 一个变量,但是我设置的每个值都只在回调函数中可见,甚至像 window.result
这样的全局变量在回调函数之外也不可见。有没有办法在回调之外 return 值?
目前我发现的唯一解决方法是在 HTML 元素中设置数据属性,但我认为这不是真正优雅的解决方案。
我建议在 ES2016 中使用 Promises
和新的 async
和 await
关键字。它使您的代码更易于阅读。
async function sendMessage(message) {
return new Promise((resolve, reject) => {
// TODO be sure SQS client is initialized
// TODO set your params correctly
const params = {
payload : message
};
sqs.sendMessage(params, (err, data) => {
if (err) {
console.log("Error when calling SQS");
console.log(err, err.stack); // an error occurred
reject(err);
} else {
resolve(data);
}
});
});
}
// calling the above and getting the result is now as simple as :
const result = await sendMessage("Hello World");