触发jquery后如何获得返回值?

时间:2019-01-03 20:21:07

标签: javascript jquery es6-promise

我有自定义事件。

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

我在getplaces Promise函数中获得了Google排名,该函数为我返回data。如果我写.then(data => { console.log(data) }),我会看到结果。

然后我尝试在data之后得到trigger

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

但是我做不到。

如何在触发后获取返回值?

2 个答案:

答案 0 :(得分:2)

您不能直接从事件处理程序中返回值。您将需要使用事件对象传递您的Promise。 jQuery通过将值分配给事件对象的result属性来自动做到这一点:

event.result

  

说明:事件处理程序返回的最后一个值,此事件触发该事件,除非该值未定义。

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

等于:

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

要在触发后能够访问返回的Promise,您需要创建一个自定义事件对象,并将其传递给trigger函数:

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

//e.result now holds the promise
e.result.then(value => {
  // do something with value
})

答案 1 :(得分:0)

对于所问问题的最佳答案是,在触发事件处理程序后,您不应尝试访问结果。相反,您要将使用承诺结果的代码放在.then()回调中。

这样想吧:Javascript编程非常受事件驱动。这意味着您一直在编写代码,说“当 foo 发生时,运行功能 bar ”。这种类型的代码通常是嵌套的,这对于一系列事件是很好的。

您要编写表示以下内容的代码:

  

无论何时触发searchPlaceOnWebMap事件,都要根据事件的有效负载进行调用以获取匹配的位置。当那个调用返回时,对结果进行一些处理。

在这种情况下,由于.getPlaces()返回了保证,因此对结果进行处理的方法是使用.then(results => doSomething(results))async/await语法(如果您可以使用的话)。

但是重要的是要意识到,由于您不知道承诺何时会解决,因此您无法在触发事件后立即访问其结果,因为它们尚不可用。


当然,您可以将.getPlaces()返回的promise对象存储在某个位置,并在调用.trigger()之后在其他位置访问它,但这不是一个好主意,因为它引入了更改外部对象的副作用。状态,导致难以测试,调试和维护的代码。如果可以,请避免使用它。