【发布时间】:2017-10-23 17:26:41
【问题描述】:
我的问题与this one 类似,但我无法用这些答案解决它。
简而言之,在页面加载时,ajax 调用会生成一个下拉选择元素,然后根据某些参数设置其默认值。
代码是这样的:
getList('country', null, q, 'category:customer', null);
newReportSelection.apply($("#report"));
function getList(field, val, q, fq, default_value) {
$.get(... {
// call info
}, function(result) {
// appending the dropdown to DOM
});
};
newReportSelection = function () {
// determine and select default option
}
getList 在不同的地方使用,所以我不能将这个(特定于页面加载)newReportSelection() 代码添加到 ajax 回调函数中。
在 getList() 调用周围放置一个承诺不会等待 Ajax 调用,因为它是异步的。
在 Ajax 调用周围放置一个等待它被发送,而不是等待回调函数被执行。
在回调函数周围放置一个也不起作用,因为 Ajax 部分等待它,但 getList() 由于异步性而继续运行。
即使在 Ajax 调用和回调函数上链接承诺有效,这看起来也是一个非常肮脏的解决方法并且不可取。
我有没有办法让 newReportSelection() 调用等到整个 getList() 完成,而无需手动将 Ajax 调用设置为async: false?
提前致谢。
【问题讨论】:
-
只需在附加到 DOM 的 ajax done 函数中调用 newReportSelection() 即可?
-
正如我所提到的,我不能,因为 getList() 函数在多个地方被调用,而 newReportSelection() 部分仅适用于其中一种情况。
-
如何在 getList 函数中提供一个新参数,该参数是您要触发的回调并在结果回调中调用该函数?如果在其他地方使用,只需检查您是否在结果函数中传递了回调,如果是,则执行回调,否则跳过回调
-
这可能会起作用,但不会那么优雅(特别是对于其他调用,尽管您可以省略参数)。 freen-m 下面的答案解决了这个问题,而不影响其他呼叫,并且通过异步性更好地流动。感谢您的建议!
标签: javascript jquery ajax asynchronous promise