同步javascript调用MVC 4 Controller动作

时间:2014-10-14 14:09:47

标签: javascript jquery ajax asp.net-mvc-4

我正在写一段代码,我需要一些顺序执行的函数,我使用了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变量时,我需要以同步方式调用函数,任何帮助都将不胜感激,谢谢。

2 个答案:

答案 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来处理多个承诺。