【问题标题】:Wait for the end of TWO asynchrounous functions before firing a third (jQuery Deferred ?)在触发第三个之前等待两个异步函数的结束(jQuery Deferred?)
【发布时间】:2013-10-07 21:01:04
【问题描述】:

我正在尝试理解 jQuery 的 Deferred,但尽管有示例,但我无法实现我想做的事情。

所以,我想异步调用 2 个函数,当两个函数都结束时,再调用另一个函数。

这是我的代码

function1();
function2();

function3();

function1()function2() 对我的 ASP.NET 应用程序进行 ajax 调用,它们完美地工作。它们必须在function3() 开始之前结束。

我正在阅读并再次阅读 the documentation 但 function3() 不会等待另外两个结束。您能否提供我的一些样本以便我理解Deferred?我真的需要他们来完成我项目的重要部分。

非常感谢。


奖金问题

我读过.when deferred... 可以在<div> 元素中写入类似function1() running,然后function2() running em> 等等...?

更新

更多关于function1()function2() 的细节:它们非常相似,这是它们的正文:

function function1() {
    return $.ajax({
        url         :   "@Url.Action("MyMethod", "MyController")",
        contentType :   "application/json; charset=utf-8",
        dataType    :   "json"
    }).done(function(data) { 
        $.each(data, function(index) {
            pushDatas(data[index]);
        })
    }).fail(function (result) {
        alert("function1failed");
    });
}

function pushDatas(data)
{
    if(!($.inArray(data, loadedDatas) !== -1)) {
        loadedDatas.push(data);
    }
}

更新 2

函数是这样调用的:

<script type="text/javascript">
    $(document).ready(function () {
        //some others asynchrounous functions

        $.when(function1(), function2()).done(function3("test"));
    }

    ...

</script>

【问题讨论】:

  • 对于您的奖金问题,您为什么要这样做?控制台是存放此类信息的好地方,除非您真的希望最终用户看到它。
  • 嗯,目标是在
    中写入执行哪个函数,但是,我只需要在函数开头覆盖 div 的内容...我可能想要用 .when() 做一些困难的事情,而这真的很容易......

标签: javascript jquery asynchronous jquery-deferred deferred


【解决方案1】:

function1 和 function2 必须返回 Promise 对象才能使其工作。例如,

function function1 () {
    return $.ajax({...});
}

现在你可以使用$.when

$.when(function1(),function2()).done(function3);

编辑:或:

$.when(function1(),function2()).done(function(){
    function3("test");
});

【讨论】:

  • function3() 已执行,而 function1()function2() 尚未完成...有关信息,ajax 调用看起来像 $.ajax(...).done(); 没有返回。
  • 必须有回报,否则将无法正常工作。 function1 和 function2 必须返回一个 deferred 或 promise 对象。如果他们没有,并且您无法修改它们,并且他们没有回调,那么您无能为力。
  • 好的,所以我必须返回一个promise 对象,但是,有两个问题:必须在哪里声明 Deferred ?作为全局变量还是在函数中?我必须.resolve吗?我只是尝试了两个,但它不起作用,我可能忘记了一些东西......
  • 好吧,$.ajax() 本身已经返回了一个 Promise 对象,所以如果你只是简单地执行return $.ajax(.. 就可以了。
  • 我尝试return $.ajax(),但在屏幕上显示某些内容的function3 仍然在function1 和2 完成之前执行。请查看我更新的问题。
猜你喜欢
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多