2013-12-10 156 views
-1

我是AJAX领域的全新品牌。我有一个Mysql数据库,其中包含一个填充了URL的列。我的最终目标是通过点击事件从数据库加载具有唯一URL的iframe。如果有人有更好的方法,请让我知道。我的AJAX代码有什么问题

现在,但我只是试图找出如何通过尝试检索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

retrieveURL(retrieve_callback());不正确。

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

你应该通过它想:

retrieveURL(retrieve_callback);

+0

谢谢哟但是,这却带来了一个新问题。我的请求不是调用成功函数。我添加了一个错误返回来调试它,但它也不输出任何信息。这似乎是要求挂起。再次感谢大家的帮助。 – Jesse

+0

完全可能你的PHP搞乱了某个地方,我不太熟悉它。成功后添加'失败:retrieve_callback',看看是否被触发。 –

+0

我添加了一个失败函数来做alert(“我搞砸了”)和console.log(“我搞砸了”)。仍然没有成功,错误或失败功能的输出。 – Jesse

0

此:

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

您与调用retrieve_callback的结果调用retrieveURL()。做到这一点,而不是:

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

在Javascript中,方法是对象了。在这种情况下,您将方法retrieve_callback作为对象传递给retrieveURL。另一方面,retrieveURL将方法retrieve_callback作为成员“成功”分配给传递给$ .getJSON()的匿名对象。 这意味着匿名对象现在有一个名为“success”的方法,其工作方式与retrieve_callback类似。

成功AJAX请求后,jQuery使用的化名对象,并调用它的成功,方法是这样的:

blaObject.success(ajaxResult); 

我们知道,“成功”是“retrieve_callback”的副本,所以follwing会发生:

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