我的AJAX代码出了什么问题

What is wrong with my AJAX code

本文关键字:什么 问题 AJAX 代码 我的      更新时间:2024-06-04

我是AJAX世界的新手。我有一个Mysql数据库,其中包含一个充满URL的列。我的最终目标是让一个点击事件从数据库中加载一个具有唯一URL的iframe。如果有人有更好的方法,请告诉我。

然而,现在我只是试图通过检索URL来弄清楚AJAX是如何工作的。我已经附上了我的Javascript代码和PHP代码。

PHP代码确实输出了一个json编码的数据副本。然而,javascript将变量结果报告为未定义。我认为这可能与AJAX的"异步"方面有关,但我遵循了本教程,试图使代码正确工作。我感谢所能提供的任何帮助。

如何从异步调用返回响应?

这是我的代码Javascript代码,它记录的结果是未定义的,"我做到了"控制台

function retrieve_callback(result) { 
    console.log (result);
    console.log("I made it!");
    };
function retrieveURL (retrieve_callback) {  
    $.getJSON({
        url: './fetch.php',
        dataType: 'json',
        success: retrieve_callback
    });
}
//Runs when our document initializes
$( document ).ready(function() {
    retrieveURL(retrieve_callback());
});

这是我的PHP代码,它输出URL 的JSON数组

<?php
//--------------------------------------------------------------------------
// Connect to mysql database (I've removed the info from this example but it works)
//--------------------------------------------------------------------------
$db = new mysqli($DB_HOST, $DB_USER, $DB_PASSWORD, $DB_NAME);
if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');
}
//--------------------------------------------------------------------------
// Query mysql database
//--------------------------------------------------------------------------
$links = array();
//SQl query
$sql = <<<SQL
    SELECT `Gnews_url`
    FROM `Gnews_RSS`
SQL;
if(!$result = $db->query($sql)){
    die('There was an error running the query [' . $db->error . ']');
}
while($row = $result->fetch_assoc()){
    array_push($links, $row);
}
echo json_encode($links);

retrieveURL(retrieve_callback());不正确。

retrieveURL希望您传递一个函数引用,以便在请求完成后执行它。相反,您正在执行retrieve_callback,并将结果(undefined)传递给retrieveURL,因此当请求完成时,它实际上不会执行任何操作。不仅如此,您还在发出请求之前执行回调。

你应该像这样通过:

retrieveURL(retrieve_callback);

这:

$( document ).ready(function() {
    retrieveURL(retrieve_callback());
});

您正在使用调用retrieve_callback()的结果调用retrieve URL。改为:

$( document ).ready(function() {
    retrieveURL(retrieve_callback);
});
retrieveURL(retrieve_callback); // no brackets for retrieve_callback

在Javascript中,方法也是对象。在这种情况下,您将方法retrieve_callback作为对象传递到retrieveURL中。另一方面,retrieveURL确实将retrieve_callback方法作为成员"success"分配给传递到$.getJSON()中的匿名对象。这意味着匿名对象现在有一个名为"success"的方法,其工作原理类似于retrieve_callback。

在AJAX请求成功后,jquery使用匿名对象并调用其成功方法,如下所示:

blaObject.success(ajaxResult);

我们知道"success"是"retrieve_recallback"的副本,因此将发生以下情况:

// instead of blaObject.success(ajaxResult);
retrieve_callback(ajaxResult);

让我们简单地解释一下(参见括号的用法):

// Get the result of a call of retrieve_callback() and pass it to retrieveURL.
retrieveURL(retrieve_callback());
// Pass the method retrieve_callback itself  retrieveURL.
retrieveURL(retrieve_callback);