Асинхронная функция, возвращающая обещание вместо значения

1

Я пытаюсь понять, как async/await работает вместе с обещаниями.

Код

async function latestTime() {
  const bl = await web3.eth.getBlock('latest');
  console.log(bl.timestamp); // Returns a primitive
  console.log(typeof bl.timestamp.then == 'function'); //Returns false - not a promise
  return bl.timestamp;
}
const time = latestTime(); // Promise { <pending> }

вопрос

Насколько я понимаю, ожидание должно блокироваться, а в коде выше он, похоже, блокирует возвращение объекта bl с примитивной timestamp. Затем моя функция возвращает примитивное значение, однако временная переменная устанавливается вместо ожидающего обещания вместо этого примитива. Что мне не хватает?

  • 0
    это то, что делают асинхронные функции - читайте спецификацию
  • 0
    await should be blocking - блокировка кода в javascript - это «плохая идея», а async / await не имеет ничего общего с блокировкой
Показать ещё 1 комментарий
Теги:
async-await
promise
primitive

2 ответа

2
Лучший ответ

Префикс Async - это своего рода оболочка для Promises.

async function latestTime() {
    const bl = await web3.eth.getBlock('latest');
    console.log(bl.timestamp); // Returns a primitive
    console.log(typeof bl.timestamp.then == 'function'); //Returns false - not a promise
    return bl.timestamp;
}

Такой же как

function latestTime() {
    return new Promise(function(resolve,success){
        const bl = web3.eth.getBlock('latest');
        bl.then(function(result){
            console.log(result.timestamp); // Returns a primitive
            console.log(typeof result.timestamp.then == 'function'); //Returns false - not a promise
            resolve(result.timestamp)
        })
}
  • 0
    Спасибо за наглядный ответ, я явно упустил суть.
2

Функция async любом случае вернет Promise. Возвращаемое значение будет "Promise", поэтому в вашем случае это будет:

async function latestTime(): Promise<some primitive> {
  const bl = await web3.eth.getBlock('latest');
  return bl.timestamp;
}

Таким образом, вы можете использовать его как:

const time = await latestTime();

Но для достижения общего представления о функции async/await лучше прочитать документацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню