【问题标题】:Async run for javascript by using listeners使用侦听器为 javascript 异步运行
【发布时间】:2014-07-19 17:34:42
【问题描述】:

我有两个函数,名字是Function3,Function4,Function3会通过ajax发送请求到服务器端获取jsondata,但是大概需要3秒左右才能完成。 Function4 是一个普通函数,它会等待 Function3 的结果然后执行。 我的代码如下:

  function ajaxRequest(container)
  {
    $.ajax({
        url: "Home/GetResult",
        type: "post",
        success: function (data) {
            container.append(data.message);
        }
    });
  }

  var eventable = {
    on: function (event, cb) {
        $(this).on(event, cb);
    },
    trigger: function (event) {
        $(this).trigger(event);
    }
}

var Function3 = {
    run: function () {
        var self = this;
        setTimeout(function () {
            ajaxRequest($(".container1"));
            self.trigger('done');
        }, 500);
    }
}

var Function4 = {
    run: function () {
        var self = this;
        setTimeout(function () {
            $(".container1").append("Function4 complete");
            self.trigger('done');
        },500);
    }
}

$.extend(Function3, eventable);
$.extend(Function4, eventable);

Function3.on('done', function (event) {
    Function4.run();
});

Function4.on('done', function () {
    $(".container1").append("All done");
});

Function3.run();

但现在的问题是,当我启动代码时,它总是显示结果为:首先会出现“Function4 complete”,然后是“All done”,3秒后,会出现“Function3 complete”。 这出乎我的意料,因为我的预期是“Function3 complete”排在第一位,“Function4 complete”排在第二位,“All done”预计排在最后。

有人可以帮我解决这个问题吗?谢谢你的建议。

编辑:
我现在已经包含了上面的所有功能。
此外,您可以检查 JSFiddle 中的 js 脚本:http://jsfiddle.net/sporto/FYBjc/light/
我已将 JSFiddle 中的函数从常见的数组推送操作替换为 ajax 请求, 然后一切都出乎我的意料。

【问题讨论】:

  • 你能完成你的代码吗?或者为它建立一个 JSFiddle。
  • @MarkGabriel 已添加。

标签: javascript asynchronous listener


【解决方案1】:

您需要在Function3() 发出的ajax 请求之后的成功函数中调用Function4()。这样Function4 总是在Function3 之后执行。

我是否可以建议更具暗示性的函数名称:)

我什至认为你不需要所有的超时

【讨论】:

  • 是的,您的建议是正确的。但我不认为它遵循侦听器模式。
【解决方案2】:

Function4 首先完成,因为 ajaxRequest$.ajax 调用是异步的,并且在等待 ajax 回复时代码的顺序将继续。

var Function3 = {
    run: function () {
        var self = this;
        setTimeout(function () {
            ajaxRequest($(".container1")); 
            //code sequence continues on while ajax hasn't replied yet
            self.trigger('done');
        }, 500);
    }
}

Function3 触发done 时,Function4 现在将运行。并且将追加"All done",因为所有这些都发生在ajax 有机会回复并运行其success 函数之前。

如果您希望它们是连续的,请在 $.ajax 的成功函数中运行 Function4。 或者,您可以在$.ajax's success 之后向Function3 发送信号。这样,Function3 只有在 AJAX 成功后才会真正“完成”。

编辑:
我们的意思是:

success: function (data) {
    container.append(data.message);
    //here you need to call Function4, to make sure it only runs after Function3's ajax-request has finished
}

【讨论】:

  • 好的,没用,我想在这种情况下可能没有使用侦听器模式。
  • Ajax 请求本身就是一个特别的东西。因为它们是异步的,所以你永远无法知道它们何时完成。这就是为什么,对于 ajax 请求,它们具有那些特殊的成功函数(即 ajax 请求的侦听器,以解决该问题。
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2021-12-30
  • 2021-05-31
相关资源
最近更新 更多