我对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的承诺的事情(这可能会让我免于疯狂):
谢谢!
答案 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