【问题标题】:Return value from callback function in AWS Javascript SDKAWS Javascript SDK 中回调函数的返回值
【发布时间】:2019-02-06 00:55:39
【问题描述】:

我正在使用 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函数使用回调函数来输出操作是否成功。我不想打印到控制台,而是想返回一个变量,但我设置的每个值都只在回调函数中可见,即使像 window.result 这样的全局变量在回调函数之外也是不可见的。有没有办法在回调之外返回值?

目前我发现的唯一解决方法是在 HTML 元素中设置数据属性,但我认为这不是真正优雅的解决方案。

【问题讨论】:

  • 问题不在于可见性,而在于时机。当然,全局变量是全局可见的。在您的情况下发生的情况是您尝试访问变量之前它被赋值,因为回调函数稍后执行。
  • @marekful,同意这个问题已经被问过了,但接受的答案是从 2011 年开始的。幸运的是,JS 发展了一点,今天允许更清洁的解决方案。
  • @Vasilis,抱歉链接错了。点击它的副本并在那里检查答案。

标签: javascript amazon-web-services aws-sdk-js


【解决方案1】:

我建议在 ES2016 中使用 Promises 以及新的 asyncawait 关键字。它使您的代码更易于阅读。

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");

【讨论】:

  • 它可能只是try { const result = await sqs.sendMessage({..}).promise() } catch (err) throw err },但 OP 正试图在浏览器中实现它,并非所有浏览器都支持异步等待语法。
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多