Как получить возвращаемое значение после триггера JQuery? - PullRequest
0 голосов
/ 03 января 2019

У меня есть пользовательское событие.

$('body').on('searchPlaceOnWebMap', (event, payload) =>
  this.webMap.getPlaces(payload).then(data => data)
);

Я получаю Google мест в моей функции getplaces обещание, эта функция возвращает data для меня. Если я напишу .then(data => { console.log(data) }), я увижу результат.

Затем я пытаюсь получить data после trigger

const result = $('body').trigger('searchPlaceOnWebMap', searchValue)

Но я не могу этого сделать.

Как я могу получить возвращаемое значение после триггера?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Лучший ответ на заданный вопрос - не пытаться получить доступ к результатам после срабатывания обработчика событий. Вместо этого вы хотите поместить код, который использует результат обещания, в обратный вызов .then().

Думайте об этом так: программирование на Javascript основано на событиях. Это означает, что вы все время пишете код, который говорит: «когда foo происходит, запустите функцию bar ». И этот тип кода часто является вложенным, и это нормально для последовательности событий.

В вашем случае вы хотите написать код, который выражает следующее:

Всякий раз, когда срабатывает событие searchPlaceOnWebMap, позвоните, чтобы получить подходящие места на основе полезной нагрузки события. Когда этот вызов вернется, сделайте что-нибудь с результатами.

Способ что-то сделать с результатами в этом случае, потому что .getPlaces() возвращает обещание, это использовать синтаксис .then(results => doSomething(results)) или async/await, если он вам доступен.

Но важно понимать, что, поскольку вы не знаете, когда обещание будет разрешено, вы не можете сразу получить доступ к его результатам сразу после запуска события, потому что они еще не будут доступны.


Конечно, вы можете хранить объект обещания, возвращаемый .getPlaces() где-нибудь, и обращаться к нему в другом месте после вызова .trigger(), но это не очень хорошая идея, так как он вводит побочный эффект изменения внешнего состояния, что делает для кода, который сложно протестировать, отладить и поддерживать. Держитесь подальше от этого, если можете.

0 голосов
/ 03 января 2019

Вы не можете напрямую вернуть значение из обработчика событий.Вам нужно будет передать ваше обещание, используя объект события.jQuery делает это автоматически, присваивая значение свойству result объекта события:

event.result

Описание: последнее значение, возвращаемоеобработчик события, который был вызван этим событием, если значение не было неопределенным.

$('body').on('searchPlaceOnWebMap', (event, payload) => this.webMap.getPlaces(payload));

Это равно:

$('body').on('searchPlaceOnWebMap', (event, payload) => {
  event.result = this.webMap.getPlaces(payload)
});

И чтобы иметь возможность доступа к возвращенномуОбещание после вашего триггера, вам нужно создать пользовательский объект события, который вы передаете функции trigger:

var e = jQuery.Event("searchPlaceOnWebMap");
$('body').trigger(e, obj)

//e.result now holds the promise
e.result.then(value => {
  // do something with value
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...