Я пытаюсь понять, как 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
. Затем моя функция возвращает примитивное значение, однако временная переменная устанавливается вместо ожидающего обещания вместо этого примитива. Что мне не хватает?
Префикс 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)
})
}
Функция 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
лучше прочитать документацию.
await should be blocking
- блокировка кода в javascript - это «плохая идея», а async / await не имеет ничего общего с блокировкой