首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将参数传递给jquery延迟任务的设计模式

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

Stack Overflow用户
提问于 2014-08-18 19:39:40
回答 2查看 636关注 0票数 1

试着把我的注意力集中在延期的任务上。使下列功能成为承诺是合法的吗?我不想在ajax调用解决后立即采取行动--这还为时过早--而是当UI元素完全填充了ajax调用返回的数据时。在成功的回调中有一个循环。

代码语言:javascript
运行
复制
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();

}

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

代码语言:javascript
运行
复制
$.when( populateCitiesDropdown ).done( function () ...

编辑(补充背景):

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

代码语言:javascript
运行
复制
              $.when(ajax1, ajax2, ajax3).done( function () { foo() ; });

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

当填充了所有的下拉列表(在所有ajax请求解决之后的一段时间),我将发出一个BindMainRecordtoUI调用。

EN

Stack Overflow用户

回答已采纳

发布于 2014-08-18 19:55:08

你在寻找比这更复杂的东西吗?

代码语言:javascript
运行
复制
$.when( populateCitiesDropdown(xxx) ).done( function () ...

请记住,$.when()不接受回调函数。这需要一个承诺。因此,您必须实际调用和执行populateCitiesDropdown函数(并且在这样做时可以传递任何参数),并且它返回立即作为参数传递给$.when()的承诺。这与.done().then()处理程序不同,它们实际上是回调,以后代码将调用这些回调。

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

代码语言:javascript
运行
复制
populateCitiesDropdown(xxx).done(function() {...});

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

而且,真的没有理由创建一个新的延迟。jQuery已经从ajax调用中返回了一个承诺,因此您只需使用该调用:

代码语言:javascript
运行
复制
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()是实现它的标准承诺方式。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25370823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档