这为将来添加了一个成功/错误处理程序,例如:async function send(item) { // ...}for (const item of items) { const sendPromise = send(item); sendPromise .then(x => console.log(x)) .catch(x => console.error(x))}而不是像这样等待:for (const item of items) { const sendPromise = send(item); try { const x = await sendPromise console.log(x) } catch (e) { console.error(e) }}python的Task相当于JS的promise.then()没有等待吗?async def send(item): passfor item of items: send_coro = send(item) send_task = asyncio.create_task(send_coro) # ?????}
1 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
如果我正确阅读了 JavaScript,它会为将来添加一个错误处理程序。直译应该是这样的:
def _log_err(fut):
if fut.exception() is not None:
print(f'error: {fut.exception()}')
for item in items:
send_future = asyncio.create_task(send(item))
send_future.add_done_callback(_log_err)
请注意,上面不是惯用的,因为它诉诸回调并且不如原始 JavaScript 优雅,其中then并catch返回很好地链接的新期货。
更好的方法是使用辅助协程来托管await. 这不需要外部函数是async def,因此相当于上面的:
async def _log_err(aw):
try:
return await aw
except Exception as e:
print(f'error: {e}')
for item in items:
asyncio.create_task(_log_err(send(item)))
添加回答
举报
0/150
提交
取消