将参数传递给jQuery延迟任务的设计模式

提姆

试图让我绕开延期的任务。保证以下功能合法吗?我不希望ajax调用解决后立即采取行动(那还为时过早),而是当UI元素已完全用ajax调用返回的数据填充时采取措施。成功回调中存在一个循环。

function populateCitiesDropdown( state ) {

    var dfd = new $.Deferred();

    // ajax call to get cities for the specified state
    // ...
    // (removed)
    // ...

    url:  "GetCitiesForSpecifiedState?state=" + state,

    // ...

    }).success ( function ( result, b, c) {

        // loop through result data
        //  populate Cities SELECT element
        // resolve when loop is finished
        dfd.resolve();

    });

    return dfd.promise();

}

使用时如何将state参数传递populateCitiesDropdown函数$.when( ...

$.when( populateCitiesDropdown ).done( function () ...

编辑(其他背景):

需要使用多个ajax调用返回的数据填充多个下拉列表。每个任务都包含一个ajax数据提取和一个正在填充的SELECT。如果我只是将ajax调用传递给$ .when,则:

              $.when(ajax1, ajax2, ajax3).done( function () { foo() ; });

然后函数foo()会过早执行,即在填充SELECT元素之前。Ajax调用会在其成功回调中的代码执行之前解析。

当所有下拉列表都已填充时(发生在所有ajax请求解析之后的某个时间),那么我将发出BindMainRecordtoUI调用。

jfriend00

您是否正在寻找比这更复杂的东西:

$.when( populateCitiesDropdown(xxx) ).done( function () ...

记住$.when()不要带回调函数。这是有希望的。因此,您必须实际调用并执行该populateCitiesDropdown函数(并且可以在执行此操作时将其传递给您想要的任何参数),然后它返回立即作为参数传递给的promise $.when()这与.done()or.then()处理器不同,后者的确是回调,稍后将由promise代码调用。

另外,请记住,如果您只有一个承诺,则没有理由使用,$.when()因为您可以直接将其.done()放在返回的承诺上。

populateCitiesDropdown(xxx).done(function() {...});

的目的$.when()是一次管理多个承诺,而不仅仅是一个。


另外,实际上没有理由创建新的延迟。jQuery已经从ajax调用返回了一个promise,因此您可以使用该承诺:

function populateCitiesDropdown( state ) {

    return $.ajax({...    

    // ajax call to get cities for the specified state
    // ...
    // (removed)
    // ...

    url:  "GetCitiesForSpecifiedState?state=" + state,

    // ...

    }).then ( function ( result, b, c) {

        // loop through result data
        //  populate Cities SELECT element
        // resolve when loop is finished

    });

}

而且,你应该切换到.then(),而不是.success()作为.success()被弃用,.then()是做它的标准方式的承诺。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将参数传递给Gradle Exec任务

来自分类Dev

将参数传递给命令模式

来自分类Dev

将参数传递给交互模式

来自分类Dev

将参数传递给命令模式

来自分类Dev

如何将参数或参数传递给Gradle任务

来自分类Dev

jQuery将参数传递给插件

来自分类Dev

将参数传递给jQuery函数动画

来自分类Dev

jQuery:将参数传递给模态

来自分类Dev

将参数传递给Jquery Fadeout函数

来自分类Dev

jQuery将参数传递给插件

来自分类Dev

将数组传递给jquery参数

来自分类Dev

如何将参数传递给任务队列?

来自分类Dev

将命令行参数传递给运行任务

来自分类Dev

您如何将参数传递给艰巨的任务?

来自分类Dev

我可以将参数传递给gulp任务吗?

来自分类Dev

将包参数传递给执行包任务

来自分类Dev

将字符串作为参数传递给gulp任务

来自分类Dev

如何将多个参数传递给Luigi子任务?

来自分类Dev

如何将参数传递给Windows计划任务?

来自分类Dev

如何通过cfschedule将参数传递给计划任务?

来自分类Dev

将参数传递给async.js任务

来自分类Dev

我如何将参数传递给gulp任务,而该任务又由Gradle任务调用

来自分类Dev

我如何将参数传递给gulp任务,而该任务又由Gradle任务调用

来自分类Dev

将参数传递给C#中的工厂模式架构

来自分类Dev

如何将参数传递给模式弹出窗口?

来自分类Dev

如何使用Ajax将参数传递给模式形式

来自分类Dev

将参数传递给C#中的工厂模式架构

来自分类Dev

如何将参数传递给模式弹出窗口?

来自分类Dev

RoR - 将参数传递给 Bootstrap 模式。背景不会淡出