Как использовать асинхронный объект функции ожидания в Javascript?

Скажем, у меня есть функциональный объект-

setObj : function(a,b){
    obj.a = a;
    obj.b = b;
}

Если мне нужно использовать async & await для этого функционального объекта, как мне это сделать?

Если то же самое было написано в функции (функциональным способом), скажем:

async function setObj(a,b){
    obj.a = a;
    obj.b = b;
}

await setObj(2,3);

Это прекрасно работает. Но как мне это сделать в случае функционального объекта?


person bozzmob    schedule 10.12.2015    source источник


Ответы (4)


Если я правильно понял ваш вопрос, вы можете просто использовать ключевое слово async перед объявлением метода:

let obj = {};
let myObj = {
    async setObj(a,b) {
        obj.a = a;
        obj.b = b;
    }
}

См. http://tc39.github.io/ecmascript-asyncawait/#async-methods< /а>

ОБНОВЛЕНИЕ

Вы не можете использовать await вне асинхронной функции. Чтобы использовать это, вы должны обернуть этот вызов в await setObj(2, 3):

async function consoleLog() {
    await myObj.setObj(2, 3);
    console.log(obj.a + obj.b);
}

consoleLog();
person Ben March    schedule 10.12.2015
comment
В Gist переместите ключевое слово async перед функцией после : - person Ben March; 10.12.2015
comment
Смотрите мои комментарии в Gist, вы неправильно используете ключевое слово await, оно должно быть внутри асинхронной функции. - person Ben March; 10.12.2015
comment
Пожалуйста, ознакомьтесь с сутью обновления 1. При внесении изменений я получаю следующую ошибку: SyntaxError: отсутствует } после списка свойств. - person bozzmob; 11.12.2015
comment
Бен на месте. Посмотрите мой обновленный ответ, который работает с вашим кодом. - person Hans; 11.12.2015
comment
Вы можете использовать Babel REPL, чтобы попробовать это, я настроил его для вас: tinyurl.com/zzvrzmv - person Ben March; 11.12.2015
comment
Большое спасибо вам обоим! Я узнал больше, чем 1 способ сделать это. :) - person bozzmob; 11.12.2015
comment
Указание ключа не работает func1: async func1() {}. Отлично, искал по всему интернету. Спасибо за решение. - person Manohar Reddy Poreddy; 20.02.2021

Используйте то же ключевое слово async в свойстве вашего объекта:

(async function () {
  var obj = {};
  console.log("hello");

  let setObj = async function (a,b){
    obj.a = a;
    obj.b = b;
  };

  await setObj(2,3);

  console.log(obj.a+obj.b);
})();

Обратите внимание, что весь код заключен в асинхронную функцию с автоматическим вызовом. Это необходимо, иначе await setObj не сможет корректно работать.

person Hans    schedule 10.12.2015
comment
Я попробовал этот подход, я получаю сообщение об ошибке, говорящее о том, что точка с запятой отсутствует. Взгляните на мой код: gist.github.com/bozzmob/f5ef1c0eff9d7e7f853d - person bozzmob; 10.12.2015
comment
Является ли setObj свойством внутри объекта? Например: пусть someFunctions = {setObj: асинхронная функция (a, b) {...}};. Ваш код не будет работать по существу, так как вы используете двоеточие вне объекта. В качестве альтернативы вы можете сделать let setObj = async function (a, b) {...}; - person Hans; 10.12.2015
comment
Проверьте обновление 1 по той же ссылке (gist.github.com/bozzmob/f5ef1c0eff9d7e7f853d). столкнулся с той же проблемой. - person bozzmob; 10.12.2015
comment
И Обновление 2 тоже. Я пробовал оба решения, которые вы сказали. Пожалуйста, не могли бы вы обновить свой текущий ответ здесь рабочим решением? - person bozzmob; 10.12.2015

использование стрелочных функций также работает

const myObject = {
   myFunc: async () => {
     await myResultHere
   }
}

используя это: поскольку функция является асинхронной, она будет работать асинхронно. Если вы хотите запустить это с ожиданием, вам придется использовать его внутри асинхронной функции.

const useFunc = async () => {
   const res = await myObject.myfunc();
} 
person Prasanna    schedule 14.09.2018

Вы можете просто поместить ключевое слово async в любую функцию, не только в объявления функций, но также в выражения функций и методы объекта. Например:

Как метод объекта:

const Object = {
    async asyncFunction() {
        await MyExamplepromise
    }
}

Как переменная:

const myFunc = async function () { await MyExamplepromise }

// this is how execute the function expression
// first () operator to execute, and use .then get access the resolved value
myFunc().then((val) => { console.log(val) })

Также обратите внимание, что асинхронная функция возвращает обещание, которое будет разрешено со значением, возвращаемым асинхронной функцией, или отклонено с необработанным исключением, созданным из асинхронной функции.

person Willem van der Veen    schedule 14.09.2018