首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Transcrypt的承诺

使用Transcrypt的承诺
EN

Stack Overflow用户
提问于 2016-10-05 15:26:17
回答 2查看 555关注 0票数 2

我在跨隐窝上玩得很开心,这是一个非常棒的Python3toJavascript编译器,可以作为一个python模块使用。我的大部分代码都是同步的,但我在处理setTimeout和XHR请求时没有遇到任何问题。现在,我已经开始使用PouchDB进行本地持久性,并试图找到一种很好的方法来处理承诺。目前,我这样做是为了编写一个pouchdb实例:

代码语言:javascript
复制
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”方法来处理这个问题?
  • 我们能利用ES7的异步/等待通过Transcrypt吗?由于Transcrypt允许从python代码中直接访问Javascript函数,我想这里可能有一些我没有得到的技巧。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-05 17:28:24

关于的承诺

你处理承诺的方式在我看来已经够了。

如果您厌倦了包含“fluent”符号(调用链)的连续行,则可以选择使用。例如,在Transcrypt附带的d3js_demo中,在以下片段中使用了这一替代方法:

代码语言:javascript
复制
self.svg = d3.select('body'
).append('svg'
).attr('width', self.width
).attr('height', self.height
).on('mousemove', self.mousemove
).on('mousedown', self.mousedown)

由于许多. .then's也可以被链接起来,所以可以这样写:

代码语言:javascript
复制
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>''')作为解决方案。

票数 3
EN

Stack Overflow用户

发布于 2018-01-12 20:30:55

现在支持异步/等待。你可以用它来处理承诺。例如:

启用JQuery使用:

代码语言:javascript
复制
__pragma__ ('alias', 'S', '$')

定义一个返回承诺的函数,在本例中是Ajax调用:

代码语言:javascript
复制
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()

异步代码作为同步使用

代码语言:javascript
复制
async def readALot():
    try:
        result1 = await read("url_1")
        result2 = await read("url_2")
    except Exception:
        console.warn("Reading a lot failed")

在浏览器中愉快地使用python

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39878066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档