使用Transcrypt的承诺

时间:2016-10-05 15:26:17

标签: transcrypt

我对Transcrypt非常有趣,这是一个出色的Python 3到Javascript编译器,可用作python module。我的大部分代码都是同步的,但是使用setTimeout和XHR请求时我没有遇到任何问题。现在我开始使用PouchDB进行本地持久化,并试图找到一种处理承诺的漂亮方式。目前,我这样做是为了写一个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)

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

关于承诺

你处理承诺的方式对我来说看起来就像pythonic一样。

如果你厌倦了那些流畅的线条延续线。涉及的符号(call chaining),可以替代使用\。这种替代方案例如用于在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)

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

关于async / await

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

答案 1 :(得分:1)

现在支持

Async / await 。你可以用它来处理Promises。例如:

启用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