我试图了解async / await如何与promise一起工作。
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
的阻塞。然后,我的函数返回原始值,但是时间变量设置为待处理的promise,而不是原始值。我想念什么?
答案 0 :(得分:5)
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
功能的一般视图,最好阅读文档。
答案 1 :(得分:4)
异步前缀是Promises的一种包装。
import openpyxl
wb = openpyxl.load_workbook('C:\\Users\\Excel\\Desktop\\Book1.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
for row in ws.iter_rows('A{}:A{}'.format(ws.min_row,ws.max_row)):
for cell in row:
if isinstance(cell.value, str):
print('string')
elif isinstance(cell.value, int):
print('integer')
elif isinstance(cell.value, float):
print('float')
与
相同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;
}
答案 2 :(得分:4)
async
函数始终返回承诺。这就是它报告异步工作完成情况的方式。如果您在其他async
函数中使用它,则可以使用await
等待其承诺兑现,但是在非async
函数中(通常在顶层或事件处理程序),则必须直接使用Promise,例如:
latestTime()
.then(time => {
console.log(time);
})
.catch(error => {
// Handle/report error
});
如果您是在JavaScript模块的顶层执行此操作,则某些环境现在支持即将推出的top-level await
in modules:
const time = await latestTime();
例如,JavaScript引擎正在支持顶级await
和Webpack has experimental support for it。
以下是您的async
函数的粗略翻译,以明确的Promise术语表示:
function latestTime() {
return new Promise((resolve, reject) => {
web3.eth.getBlock('latest')
.then(bl => {
console.log(bl.timestamp);
console.log(typeof bl.timestamp.then == 'function');
resolve(bl.timestamp);
})
.catch(reject);
});
}
一些重要的注意事项:
new Promise
的函数( promise执行程序函数)被new Promise
同步调用。
web3.eth.getBlock
被同步调用以开始工作。new Promise
捕获并转换为承诺拒绝。then
中)中引发的任何错误(等)都将被捕获并转换为拒绝。答案 3 :(得分:0)
简短的回答:代替
result = await asyncFunction();
使用:
result = await asyncFunction().then(value => value);