Измените значение переменной с данными разрешения обещания - PullRequest
0 голосов
/ 11 июня 2019

Как изменить значение data внутри asyncCall() и установить для него значение разрешения обещания, равное b.

Я хотел, чтобы asyncCall() вернул b. Но получается, что asyncCall() возвращает объект Promise.

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    resolve(data);
  });
}

async function asyncCall() {
  let data = "a";
  var result = await resolveAfter2Seconds("b");
  data = result;
  return data;
}

asyncCall();

Ответы [ 5 ]

3 голосов
/ 11 июня 2019

Использование IIFE

Если функция асинхронная, она автоматически вернет Обещание. Вам придется либо дождаться его, либо использовать .then для доступа к разрешенному значению. IIFE расшифровывается как «Выражение немедленной функции» - Тим В.Н.

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    resolve(data);
  });
}

async function asyncCall() {
  let data = "a";
  var result = await resolveAfter2Seconds("b");
  data = result;
  return data;
}

(async function() {
  console.log(await asyncCall())
})()
1 голос
/ 11 июня 2019

Асинхронная функция всегда возвращает Promise (см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Return_value).

. Если вы поместите оператор console.log (result) в тело функции asyncCall (), вы поймете, что значение действительно разрешенопрямо здесь и может быть использовано так, как вы ожидаете. Но, как задокументировано, возвращаемое значение асинхронной функции всегда будет «обещанным», так что вам также придется «ждать» вызова этой функции.

Чтобы сделать это на верхнем (глобальном) уровне, вы можете использовать IIFE (выражение немедленного вызова функции):

(async () => console.log(await asyncCall()))();

или вернуться к классическим функциям обратного вызова, используя Promise.then ():

asyncCall().then(value => console.log(value));

Некоторые браузеры также поддерживают выражения ожидания верхнего уровня:

await asyncCall();
0 голосов
/ 11 июня 2019

Вы должны использовать await, чтобы получить результат от функции async, но вы не можете использовать await вне функции async, поэтому вы должны обернуть его в функцию async.

Или вы можете просто использовать .then(), чтобы получить результат в обратном вызове.

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    resolve(data);
  });
}

async function asyncCall() {
  let data = "a";
  var result = await resolveAfter2Seconds("b");
  data = result;
  return data;
}

// Approach 1: wrap it in an async fintion
(async ()=>{
  console.log('result:', await asyncCall());
})();

// Apprach 2: Use then
asyncCall().then(result => console.log('result:', result));
0 голосов
/ 11 июня 2019

Асинхронные функции возвращает само обещание :

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    return resolve(data);
  });
}

async function asyncCall() {
  const result = await resolveAfter2Seconds("b");
  return result;
}

asyncCall().then(
  data => console.log(data)
);
0 голосов
/ 11 июня 2019

Объявление функции с асинхронным вернет классическое обещание. поэтому вы должны использовать обратные вызовы или ждать.

асинхронная функция asyncCall () вернет Promise, а не тот результат, который вы хотите.

asyncCall().then((data) => console.log('in data is your result'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...