【问题标题】:How to make a synchronous GET request in JavaScript?如何在 JavaScript 中发出同步 GET 请求?
【发布时间】:2018-01-31 15:02:13
【问题描述】:

JS代码:

function saveCategories(i){
    var categoriesList=JSON.parse(localStorage.getItem("categoriesList"));
    var code=localStorage.getItem("gameCode");

    if(i == categoriesList.length)
        return;

    var categoryName=categoriesList[i]['name'];
    var items=categoriesList[i]['items'];

    $.get('http://localhost:8080/yourfolder/newCategory.php',{GameCode:code,items:items,CategoryName:categoryName},function(resp)
        {
            saveCategories(i+1);
        });
}

PHP 代码:

<?php 
header("Access-Control-Allow-Origin");

$host="127.0.0.1";
$user="root";
$pass="password";
$databaseName="games";

$con=mysql_connect($host,$user,$pass,$databaseName);

if(!$con)
{
    die("Connection failed: ".mysqli_connect_error());
}

$code=$_GET["GameCode"];
$name=$_GET["CategoryName"];
$items=$_GET["items"];

$data=array();
foreach($items as $item)
    $data[]=addcslashes($item);
$data=implode(",",$data);

$sql="INSERT INTO games.categories(code,name,items) VALUES ('$code','$name','$data')";
$result=mysql_query($sql,$con);

echo $result;
?>

php 文件 (newCategory.php) 应该获取代码、类别名称和类别项并将它们插入到 MYSQL db。

saveCategories 递归函数应该获取每个类别的 newCategory.php 文件(在索引 i 中),但由于某种原因,它继续下一次迭代而没有从第一次获得结果GET 之前的请求。

不想要的结果是索引0中的第一个类别没有保存在MYSQL db中。

【问题讨论】:

  • 嗨,只是一个查询,它是第一次调用 saveCategories 方法(即 saveCategories(0)),最初调用的地方。
  • 我是这样调用 saveCategories 函数的:saveCategories(0) 应该保存第一个类别。
  • 您好,我建议您在调用 saveCategories(i+1); 之前先在 JS 中打印 API 的响应;方法。然后在此处发布可能有助于您和我们解决问题的回复。
  • 每个类别的响应都是1。那是因为我打印了mysql_query($sql,$con);的结果在php代码中。

标签: javascript php recursion


【解决方案1】:

在您的数据中使用async: false

示例:

 $.ajax({
    url : "/your url",
    type : "get",
    async: false,
    success : function(userStatus) {
       //your logic
    },
    error: function() {

    }
 });

【讨论】:

  • 我收到这个警告:“jQuery 已弃用同步 XMLHTTPRequest”,但它仍然没有保存第一个类别。
  • 由于对用户体验的负面影响,主线程上的同步请求已被弃用。
  • 您可以通过在调用 saveCategory(i+1) 之前放置断点来调试此代码,您必须检查 i 值以及响应数据,即 `resp'。
  • 我对每个i都得到了很好的响应,但是第一个类别没有保存。
  • 您要保存什么、如何以及在哪里保存?
【解决方案2】:

参考this 的答案,您可以将异步选项指定为 false 以使用 jquery 获取同步 Ajax 请求。你只需要指定

{async:false} 

this 文章展示了如何使用 XMLHttpRequest() 来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多