发送两个同步ajax处理调用时,无法设置$ _SESSION变量

时间:2017-07-23 19:41:05

标签: javascript php jquery ajax session

我有一个棘手的问题。

我正在处理一个表单,用于验证提交时的几件事情,使用event.preventDefault();来阻止表单在出现问题时提交。这里的问题是它同时发送多个ajax请求,这似乎阻止了php(处理AJAX调用)修改$ _SESSION变量。

我已经通过更改jquery ajax调用同步处理来确定这一点,允许更改$ _SESSION变量。

我的问题是:有没有办法允许ajax调用同步发生,同时允许在这些调用过程中修改$ _SESSION变量?我意识到AJAX调用的async:false已被弃用,显然不是最佳解决方案。

由于每个呼叫的作用,不可能将这两个呼叫的功能结合起来,尽管每次呼叫都不需要很长时间来处理。

示例jquery代码,用于解释我如何进行这些AJAX调用(显然有些编辑和简化):

$("#form-id").on('submit', function(event) {
    $.ajax({
        type: 'POST',
        url: '/url/to/processing.php',
        async:false, //fails without setting to false
        ...
    });
});
...
$("#form-id").on('submit', function(event) {
    $.ajax({
        type: 'POST',
        url: '/url/to/processing2ThatSetsSession.php',
        async:false, //fails without setting to false
        ...
    });
});

2 个答案:

答案 0 :(得分:0)

您必须连接呼叫,在另一个呼叫结束后运行一个呼叫。

我会这样做:

function ajaxPost(url, callback) {
    $.ajax({
        type: 'POST',
        url: url
        ...
    }).done(callback);
}

$("#form-id").on('submit', function(event) {
    event.preventDefault(); // Always stop the event
    // Do one ajax call and wait for the data
    ajaxPost('/url/to/processing.php', function(data) {
        // Do things with returned data and call the next ajax
        ajaxPost('/url/to/processing.php', function(moredata) {
            // Do something with moredata
            // If everything is fine, re-post it but this time do not catch the event
            $("#form-id").off("submit").submit();
        });
    });
});

您可以添加自己的逻辑以在任何回调中显示错误消息,而不是继续使用下一个回调。

有了这个,我将为多个ajax表单验证做一个特殊的方法:

// This function will get an array of objects and
// do an ajax call and process the data, one after another
function multiAjax(calls, callback) {
    var call = calls.shift();
    if (call) {
        var url = call.url;
        post(url, function(data) {
            var error = call.process(data);
            if (error) {
                callback(error);
            } else {
                multiAjax(calls, callback);
            }
        });
    } else {
        callback();
    }
}

// This is the array of objects that multiAjax will process.
// You can add or remove elements to your likings, without modifying
// the submit event callback
var ajaxArray = [{
    url: '/url/to/processing.php',
    process: function(data) {
        if (data.isWrong()) {
            return "The data is wrong";
        }
    }
}, {
    url: '/url/to/processing.php',
    process: function(data) {
        if (data != "OK") {
            return "The data is not OK";
        }
    }
}];

// Now listen for the submit event
$("#form-id").on('submit', function(event) {
    // Always stop the event
    event.preventDefault();

    // Do multiple ajax calls in one function call.
    // Because the array is mutated inside multiAjax() (yeah, bad design but I've
    // done this fast as an example), we slice() the array to get a new one
    multiAjax(ajaxArray.slice(), function(error) {
        if (error) {
            // Show the error received
        } else {
            // submit the form the same way above
            $("#form-id").off("submit").submit();
        }
    });
});

这是所有未经测试的代码,但你明白了。

答案 1 :(得分:0)

如果一个表单提交正在向同一个PHP服务器发布两个帖子,那么您应该重新考虑该体系结构,而不是构建复杂的解决方法。

我会POST到一个PHP脚本,它将在后端执行您需要的所有操作。

$.ajax({
    type: 'POST',
    url: '/url/to/all-processing.php',        
    ... // send all the data needed by all processes
});

在PHP方面: all-processing.php

session_start();
require_once './process1.php';
require_once './process2.php';