我正在写一段代码,我需要一些顺序执行的函数,我使用了ajax调用,但它是异步的,我遇到了问题
function GetLibraryActivities(libraryName, callback) {
$.ajax({
dataType: "json",
url: "/WorkflowDesigner/GetLibraryActivities/?libraryName=" + libraryName
}).done(function (data) {
console.log(data);
return data;
});
}
然后我尝试使用回调函数,但它也没有用。
function GetLibraryActivities(libraryName, callback) {
$.ajax({
'url': "/WorkflowDesigner/GetLibraryActivities/?libraryName=" + libraryName,
'type': 'GET',
'success': callback
});
}
GetLibraryActivities("Petrophysics", function (data) {
petrophysicsData = data
});
当我尝试在它返回未识别的代码下使用petrophysicsData
变量时,我需要以同步方式调用函数,任何帮助都将不胜感激,谢谢。
答案 0 :(得分:2)
这里的主要问题是你试图从AJAX回调中“返回”某些内容。您不能指望Async AJAX函数将值返回给调用它的脚本函数,因为调用它的函数在AJAX调用启动后继续运行。这是异步调用的重点,它允许javascript继续前进,而不必等待服务器通信完成。
处理此问题的最佳方法是使用回调按顺序调用函数的所有部分,从不计划使用返回。
因此,最好是在回调函数中调用处理data
的函数,而不是返回data
。它可能有点不方便,但在使用Async调用时,最好假设您只能深入调用堆栈,而不是从其中返回任何内容。
所以,而不是你的第一个选择......你会想做这样的事情......
function GetLibraryActivities(libraryName, callback) {
$.ajax({
dataType: "json",
url: "/WorkflowDesigner/GetLibraryActivities/?libraryName=" + libraryName
}).done(function (data) {
console.log(data);
ProcessResults(data);
});
}
或者,只需在回调中执行处理。
在jQuery 1.8之前,有'async'选项,它允许你强制Javascript等待ajax调用进行处理......但这会在处理时锁定浏览器,并且已被弃用。
答案 1 :(得分:0)
如果您只是返回这样的Ajax承诺:
function GetLibraryActivities(libraryName, callback) {
return $.ajax({
'url': "/WorkflowDesigner/GetLibraryActivities/?libraryName=" + libraryName,
'type': 'GET'
});
}
你可以这样做来使用值:
GetLibraryActivities("Petrophysics").done(function (data) {
// do something with petrophysics data
});
并使用then
“顺序”链接它们,如下所示:
GetLibraryActivities("Petrophysics").then(GetLibraryActivities("Astrophysics")).done(function(pertro, astro){
// Do something with both results};
});
在这个示例中,两者都将并行加载,但只有在两个promise都已完成(按任意顺序)的情况下才会调用done。
如果要加载这些内容,可以使用$.when
来处理多个承诺。