繁体   English   中英

将数据从事件处理程序传递回调用方

[英]Pass data back to caller from event handler

我怎样才能实现这一目标?

$(window).bind('done', function (e) {
    e.result = "my data";
});

var state = $(window).trigger('done');
equal("my data", state);

目前.trigger返回JQuery对象。

UPDATE

事件是从另一个模块触发的,所以我不能使用闭包。

您必须了解事件处理程序在JavaScript中是异步的。 这意味着对异步函数的调用没有输出,没有返回值。 从异步函数获取数据的唯一方法是传入一个回调,只要输出可用就会调用 - 或者当你正在等待的事件发生时。

jQuery有一个相当优雅的deferred API。 我不是它如何与事件处理程序一起工作,因为我不使用jQuery,但我想这应该是你应该去的,而不是这个...... 憎恶

我也在寻找这个。 虽然原则上从处理程序获取数据是错误的。 无论如何,以下是这个想法

不,您无法从处理程序获取数据。 因为以下https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.dispatchEvent

但是如果你使用的是JQuery,(最有可能)

  1. 由于返回值将作为事件对象存储在JQuery中的event.result中,并且此事件对象通过所有处理程序传递,因此在处理程序中,您可以通过此'event.result'获取先前的处理程序结果

  2. 原始事件触发器怎么样?

    Jquery将通过以下代码将原始事件包装到另一个事件对象中

     // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); 

    原始事件存储为event.originalEvent。 如果确实需要将一些信息传递回原始事件触发器功能。 解决方案只是将值放入该对象的属性中

     event.originalEvent.xxxx = xxxx; 

Frits是正确的 - 事件处理程序不能返回值。 你可以把它想象成一个警察的匿名提示:来电者向警方留下一些信息,警察对这些信息做了些什么。 呼叫者可能已触发警方的响应,但警方不知道信息来自何处,呼叫者对其信息的使用方式没有影响。

也就是说,你可以很容易地做你想做的事情,你只需重新安排一些事情......

var state = null;

$(window).bind('done', function (e) {
    state = "my data";
    equal("my data", state);
});

$(window).trigger('done');

不得不将JS代码的一部分移动到模块化(移动到可以插入的单独文件),在一个地方,如果使用模块,必须重置knockout.js列表。

所以这段代码:

    var treeSettings = eval(knockoutContext).Tree;

    if (oldData === listArray) {
        oldData = options.isObservable && !(treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) ? listArray().slice(0, rows.length) : [];
        listArray(oldData);
    }

成了这个:

    if (oldData === listArray) {
        oldData = options.isObservable ? listArray().slice(0, rows.length) : [];
        $(document).trigger('OnTheMove_OfflineJSBeforeListArrayReused', {knockoutContext : knockoutContext, callback : function(){ oldData = [];}});
        listArray(oldData);
    }

并在单独的文件中。

$(document).on('OnTheMove_OfflineJSBeforeListArrayReused', function (e, options) {
    var treeSettings = eval(options.knockoutContext).Tree;
    if (treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) {
        options.callback();
    }
});

我知道处理程序和回调是异步仍然似乎工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM