【问题标题】:Using promises with Transcrypt在 Transcrypt 中使用 Promise
【发布时间】:2016-10-05 15:26:17
【问题描述】:

Transcrypt 让我很开心,这是一个出色的 Python 3 到 Javascript 编译器,可用作 python module。我的大部分代码都是同步的,但我在处理 setTimeout 和 XHR 请求时没有问题。现在我已经开始使用 PouchDB 进行本地持久性,并试图找到一种处理 Promise 的漂亮方法。目前,我这样做是为了写入 pouchdb 实例:

def db_put():

    def put_success(doc):
        print("Put a record in the db. Id: ", doc.id, "rev: ", doc.rev)

    def put_failure(error):
        print('Failed to put a record in the db. Error: ', error)

    strHello = {'_id': "1", 'title': 'hello db'}
    db.put(strHello) \
    .then(put_success) \
    .catch(put_failure)

db = PouchDB('test_db')
document.getElementById("db_put").addEventListener("click", db_put)

这很好,但我很想知道一些关于 Promise 从 python 转换为 Javascript 的事情(这可能会让我免于疯狂):

  • 是否有更可取的“pythonic”方法来处理这个问题?
  • 可以通过 Transcrypt 使用 ES7 的 async / await 吗?由于 Transcrypt 允许直接从 python 代码中访问 Javascript 函数,我认为这里可能有一些我没有得到的技巧..

谢谢!

【问题讨论】:

    标签: transcrypt


    【解决方案1】:

    Async/await 现在支持一段时间了。你可以用它来处理 Promise。例如:

    启用 JQuery 使用:

    __pragma__ ('alias', 'S', '$')
    

    定义一个返回 Promise 的函数,在本例中为 Ajax 调用:

    def read(url: str) -> 'Promise':
        deferred = S.Deferred()
        S.ajax({'type': "POST", 'url': url, 'data': { },
            'success': lambda d: deferred.resolve(d),
            'error': lambda e: deferred.reject(e)
        })
        return deferred.promise()
    

    像使用同步一样使用异步代码:

    async def readALot():
        try:
            result1 = await read("url_1")
            result2 = await read("url_2")
        except Exception:
            console.warn("Reading a lot failed")
    

    在浏览器中愉快地使用python

    【讨论】:

      【解决方案2】:

      关于承诺

      你处理 promises 的方式在我看来已经够 Python 了。

      如果您对涉及“流利”表示法(调用链)的行延续感到厌烦,可以使用 \。使用这种替代方法,例如在 Transcrypt 自带的 d3js_demo 中,在如下片段中:

      self.svg = d3.select('body'
      ).append('svg'
      ).attr('width', self.width
      ).attr('height', self.height
      ).on('mousemove', self.mousemove
      ).on('mousedown', self.mousedown)
      

      由于许多 .then 也可以链接起来,因此可以这样写:

      db.put(strHello
      ).then(put_success
      ).then(put_success_2
      ).then(put_success_3
      ... etc.
      ).catch(put_failure)
      

      经过一段时间的习惯,这将立即表明涉及调用链。但这只是格式的问题。

      关于异步/等待

      它们尚不支持,但计划是在 JS 正式拥有它们后不久(我希望是 JS7)。现在您可以使用__pragma__ ('js', '{}', '''<any javascript code>''') 作为解决方法。

      【讨论】:

        猜你喜欢
        • 2018-08-09
        • 2020-06-06
        • 1970-01-01
        • 2021-04-01
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多