Возвращаемое значение из функции обратного вызова в AWS Javascript SDK

Я использую AWS Javascript SDK и следую руководству по отправке сообщения SQS. В основном я следую руководство по AWS, в котором приведен пример sendMessage следующим образом:

sqs.sendMessage(params, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data.MessageId);
  }
});

Таким образом, функция sendMessage использует функцию обратного вызова, чтобы вывести, была ли операция успешной или нет. Вместо вывода на консоль я хочу вернуть переменную, но каждое установленное значение видно только внутри функции обратного вызова, даже глобальные переменные, такие как window.result, не видны вне функции обратного вызова. Есть ли способ вернуть значения вне обратного вызова?

Единственный обходной путь, который я нашел на данный момент, - установить атрибут данных в элементе HTML, но я не думаю, что это действительно элегантное решение.


person Vasilis    schedule 05.02.2019    source источник


Ответы (1)


Я бы предложил использовать Promises и новые ключевые слова async и await в ES2016. Это делает ваш код намного легче для чтения.

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");
person Sébastien Stormacq    schedule 05.02.2019
comment
это могло быть просто try { const result = await sqs.sendMessage({..}).promise() } catch (err) throw err }, но OP пытается реализовать его в браузере, и не все браузеры поддерживают синтаксис асинхронного ожидания. - person A.Khan; 05.02.2019