2017-07-23 43 views
0

我有什麼可能是一個棘手的問題。

我正在使用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 
     ... 
    }); 
}); 

回答

0

你必須Concat的來電,要運行一個呼叫中的其他結束後。

我會做這種方式:

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(); 
     } 
    }); 
}); 

這是所有未經測試的代碼,但你明白了吧。

+0

看起來像一個偉大的想法!我一定會考慮這一點。謝謝! – Snappawapa

+0

@Snappawapa很高興你喜歡它:-) –

0

如果一個表單提交正在向同一個PHP服務器發出兩個帖子,則應該重新考慮該體系結構,而不是構建複雜的變通方法。

我會發布到一個PHP腳本,它將完成您在後端所需的一切。

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

在PHP端:全processing.php

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