这是我目前用于每5分钟发送一次请求的Javascript代码。
function sendRequest() {
$(document).ready(function() {
console.log($.post('../notify/notify.php', { notify: 1 }).done());
});
}
setInterval(function() {
console.log(sendRequest());
}, 5000);
当我在开发人员工具中检查网络时,正在发送请求并按预期返回响应。这是我的PHP代码:
header('Content-Type: application/javascript');
if(isset($_POST['notify']) && $_POST['notfiy'] == "1") {
echo json_encode(array(
'Title' => 'Welcome to our Site',
'Message' => 'You are current recieving notifications.',
'Location' => 'http://example.com/',
'State' => true
),true);
} else {
echo json_encode(array(
'State' => false
), true);
}
但是,当我检查控制台时,我发现它是一个类型Object {readyState: "1"}
,然后当我展开它时,预期的响应包含在responseText
字段中。但是,当我将console.log()
追加到.responseText
的末尾时,$.post().done()
会返回未定义。
我做错了什么?如何从PHP文件中获取响应?
更新
在回顾完问题之后,我了解到我宣布了错误的header()
。类型应为/json
而不是/javascript
。此外,响应是不可读的,因为如上所述,我只记录了请求的 promise 。我需要在function(param)
函数中添加done()
,然后使用其中的响应。
答案 0 :(得分:2)
我做错了什么?
您正在console.log()
中包含异步调用,期望$.post()
的.responseText
或.responseJSON
,或者$.post()
异步调用的回调函数的参数将被记录在console
。
console.log()
不等待异步调用完成或完成。 console.log()
将记录返回的jQuery promise对象
$.post()
但是,当我检查控制台时,我发现它是
类型Object {readyState: "1"}
.responseText
对象的<{1}}或.responseJSON
属性
返回:jqXHR
.done()
接受单个函数或函数数组,您可以在函数体中包含jxXHR
以记录设置为第一个参数的异步操作console.log()
的结果在函数回调。 $.post()
或.responseText
可作为.responseJSON
的第三个参数的属性进行访问。
.done()
您还可以.done(function(data, textStatus, jqxhr) {
console.log(data, jqxhr.responseJSON)
})
Content-Type
将headers
php
设置为"application/javascript"
,但echo
array
来自php
。 headers
应设为"application/json"
。 $.post()
接受第三个参数,即参数的预期Content-Type
或dataType
;在这里,"json"
。
// declare variable `interval` for ability to call `clearInterval(interval)`
var interval;
function sendRequest() {
return $.post('../notify/notify.php', { notify: 1 }, "json")
.done(function(data) {
console.log(data)
})
// handle error
.fail(function(jqxhr, textStatus, errorThrown) {
console.log(errorThrown)
});
}
$().ready(function() {
sendRequest().then(function() {
interval = setInterval(sendRequest, 5000);
})
})
答案 1 :(得分:1)
console.log()
调用将undefined
打印到控制台,因为您的函数sendRequest
不返回任何内容。
如果您愿意,可以使用done
承诺对您的请求撤回的数据执行某些操作:
.done(function(text) {
console.log(text);
});
答案 2 :(得分:0)
$.post('../notify/notify.php', { notify: 1 },function(data){console.log(data);})