试着把我的注意力集中在延期的任务上。使下列功能成为承诺是合法的吗?我不想在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();
}如何在使用populateCitiesDropdown时将state参数传递给$.when( ...函数?
$.when( populateCitiesDropdown ).done( function () ...编辑(补充背景):
需要用多个ajax调用返回的数据填充多个下拉列表。每个任务包括一个ajax数据获取和一个正在填充的SELECT。如果我只是将ajax调用传递给$.when:
$.when(ajax1, ajax2, ajax3).done( function () { foo() ; });然后函数foo()提前执行,即在填充SELECT元素之前执行。ajax调用在其成功回调中的代码执行之前解析。
当填充了所有的下拉列表(在所有ajax请求解决之后的一段时间),我将发出一个BindMainRecordtoUI调用。
发布于 2014-08-18 19:55:08
你在寻找比这更复杂的东西吗?
$.when( populateCitiesDropdown(xxx) ).done( function () ...请记住,$.when()不接受回调函数。这需要一个承诺。因此,您必须实际调用和执行populateCitiesDropdown函数(并且在这样做时可以传递任何参数),并且它返回立即作为参数传递给$.when()的承诺。这与.done()或.then()处理程序不同,它们实际上是回调,以后代码将调用这些回调。
另外,请记住,如果您只有一个承诺,就没有理由使用$.when(),因为您可以直接将.done()放在返回的承诺上。
populateCitiesDropdown(xxx).done(function() {...});$.when()的目的是同时管理多个承诺,而不仅仅是一个。
而且,真的没有理由创建一个新的延迟。jQuery已经从ajax调用中返回了一个承诺,因此您只需使用该调用:
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()是实现它的标准承诺方式。
https://stackoverflow.com/questions/25370823
复制相似问题