2016-10-05 3 views
2

Мне очень нравится Transcrypt, фантастический компилятор Python 3 в Javascript, доступный как python module. Большая часть моего кода является синхронным, но у меня не было проблем с выполнением запросов setTimeout и XHR. Теперь я начал использовать PouchDB для локального сохранения и стараюсь найти прекрасный способ справиться с обещаниями. На данный момент, я делаю это, чтобы написать к примеру pouchdb:Использование обещаний с Transcrypt

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) 

Это прекрасно работает, но мне интересно знать кое-что о обещаниях быть transcrypted из питона в Javascript (это может спасти меня от безумия):

  • Есть ли более предпочтительные «питонические» способы справиться с этим?
  • Можно ли использовать асинхронный/ожидающий ES7 через Transcrypt? Поскольку Transcrypt позволяет получить доступ к функциям Javascript непосредственно из кода python, я подумал, что здесь может быть какой-то трюк, который я не получаю.

Спасибо!

ответ

3

О обещаниях

Путь вы справляетесь с обещаниями выглядит достаточно вещим мне.

Если вы устали от продолжения строки, в которой задействована «плавная» нотация (цепочка вызовов), существует альтернатива использованию \. Эта альтернатива используется, например, в d3js_demo, который поставляется с Transcrypt, в следующем фрагменте:

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>''') в качестве обходного пути.

1

Async/ждет поддерживается некоторое время. Вы можете использовать его для работы с обещаниями. Например:

Включить использование 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 в браузере

+0

Полезно знать, спасибо. – fzzylogic

Смежные вопросы