无法获得帖子请求的回复

时间:2016-11-06 17:57:45

标签: javascript php jquery

这是我目前用于每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(),然后使用其中的响应。

3 个答案:

答案 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-Typeheaders php设置为"application/javascript",但echo array来自phpheaders应设为"application/json"$.post()接受第三个参数,即参数的预期Content-TypedataType;在这里,"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);})