我有自定义事件。
$('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)
但是我做不到。
如何在触发后获取返回值?
答案 0 :(得分:2)
您不能直接从事件处理程序中返回值。您将需要使用事件对象传递您的Promise。 jQuery通过将值分配给事件对象的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()
之后在其他位置访问它,但这不是一个好主意,因为它引入了更改外部对象的副作用。状态,导致难以测试,调试和维护的代码。如果可以,请避免使用它。