为了账号安全,请及时绑定邮箱和手机立即绑定

JS 的 promise.then().catch() 的 python 任务等价物是什么?

JS 的 promise.then().catch() 的 python 任务等价物是什么?

慕哥9229398 2022-04-27 13:16:49
这为将来添加了一个成功/错误处理程序,例如: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)))


查看完整回答
反对 回复 2022-04-27
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信