我的AJAX代码有什么问题

时间:2013-12-10 21:55:19

标签: javascript ajax json jquery

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

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

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

How do I return the response from an asynchronous call?

这是我的代码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);

3 个答案:

答案 0 :(得分:3)

retrieveURL(retrieve_callback());不正确。

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

你应该传递它:

retrieveURL(retrieve_callback);

答案 1 :(得分:0)

此:

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

您正在使用调用retrieve_callback()的结果调用retrieveURL。这样做:

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

答案 2 :(得分:0)

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_callback”的副本,所以下面会发生:

// 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);