试图让我绕开延期的任务。保证以下功能合法吗?我不希望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调用。
您是否正在寻找比这更复杂的东西:
$.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] 删除。
我来说两句