Вопрос был:
Как вернуть ответ от асинхронного вызова?
, который может быть интерпретирован как:
Как сделать синхронный асинхронный код синхронным?
Решение будет состоять в том, чтобы избежать обратных вызовов и использовать комбинацию Promises и async / await.
Я хотел бы привести пример для запроса Ajax.
(Хотя он может быть записан в Javascript, я предпочитаю писать его на Python и компилировать его в Javascript, используя Transcrypt . Это будет достаточно ясно.)
Позволяет сначала включить использование JQuery, чтобы
$
был доступен какS
:__pragma__ ('alias', 'S', '$')
Определить функцию, которая возвращает Promise, в этом случае вызов Ajax:
def read(url: str): 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")
Оба режима все еще поддерживаются.
Следующий вызов bind()
:
$(".foo").bind("click", function() {
// ...
});
Может быть непосредственно преобразован в следующий вызов on()
:
$(".foo").on("click", function() {
// ...
});
И следующий вызов delegate()
:
$("#ancestor").delegate(".foo", "click", function() {
// ...
});
Может быть преобразован в следующий вызов on()
:
$("#ancestor").on("click", ".foo", function() {
// ...
});
Для полноты , следующий вызов live()
:
$(".foo").live("click", function() {
// ...
});
Может быть преобразован в следующий вызов on()
:
$(document).on("click", ".foo", function() {
// ...
});
.delegate()
и .bind()
использует метод on
. И .click()
является ярлыком для .on()
тоже.
Метод on
может заменить как bind
, так и delegate
в зависимости от того, как он используется (а также click
, поскольку bind
может заменить это):
.click(handler) == .on('click', handler)
.bind('click', handler) == .on('click', handler)
.delegate('click', '#id', handler) == .on('click', '#id', handler)
Ни click
, delegate
или bind
до сих пор перешли на устаревшую страницу . Я сомневаюсь, что метод click
когда-либо будет.
Вы можете вывести использование псевдонимов из исходного кода.
console.log($.fn.delegate);
function (a, b, c, d) {
return this.on(b, a, c, d);
}
console.log($.fn.bind);
function (a, b, c) {
return this.on(a, null, b, c);
}
Документация также содержит примеры использования:
$(elements).delegate(selector, events, data, handler); // jQuery 1.4.3+
$(elements).on(events, selector, data, handler); // jQuery 1.7+