无法获取POST请求的响应

4

这是我目前用于每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字段内。 然而,当我将.responseText附加到$.post().done()的末尾时,console.log()返回undefined
我做错了什么? 我怎样才能从我的PHP文件中获取响应?
更新:
经过审查问题,我了解到我声明了错误的header()。 类型应该是/json而不是/javascript。 此外,响应无法读取,因为像先前所述,我只记录了请求的promise。 我需要在done()函数中添加一个function(param),然后在其中使用响应。
3个回答

2
我做错了什么?
您正在将异步调用包装在 console.log() 中,期望 $.post().responseText.responseJSON,或者 $.post() 异步调用的回调函数参数被记录在 console 中。 console.log() 不会等待异步调用完成。 console.log() 将记录由 $.post() 返回的 jQuery promise 对象。
然而,当我检查控制台时,我看到它是一个类型为 Object {readyState: "1"} 的对象,而不是 jxXHR 对象的 .responseText.responseJSON 属性。
返回:jqXHR .done() 接受单个函数或函数数组,您可以在函数体内包含console.log(),以记录设置为回调函数第一个参数的异步操作$.post() 的结果。 .responseText .responseJSON 可作为第三个参数的属性在 .done() 中访问。
.done(function(data, textStatus, jqxhr) {
  console.log(data, jqxhr.responseJSON)
})

你还需要在PHP中设置Content-Type头为"application/json",因为你虽然从PHP中使用echo输出了一个数组,但是你也在PHP中设置了Content-Type头为"application/javascript"。$.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);
   })
})

好的,这个完美地工作了,我不知道怎么做到的,但是非常感谢你! - Jaquarh
为什么你在 php 中将 headerContent-Type 设置为 "application/javascript"?应该将 Content-Type 设置为 "application/json" 吗? - guest271314

1
< p > console.log() 调用将 undefined 打印到控制台,因为您的函数 sendRequest 没有返回任何内容。

如果您希望可以使用 done promise 对请求返回的数据执行某些操作:

.done(function(text) {
    console.log(text);
});

哦,好的,你说得对。我的请求没有成功。这是因为我的 PHP 代码吗?他提供的那段代码实际上会抛出一个意外的标记异常,我在我的 .htaccess 中确实有一个重写,也许这就是原因? - Jaquarh
这可能是我们想要的,但这不是他编写的代码。根据 OP 的说法,该函数不返回任何内容,因此 console.log 将在控制台中打印 undefined。你同意吗? - Dekel
由于您的函数sendRequest没有返回任何内容,因此“不完全正确”是针对问题中的JavaScript而言。 OP希望从$.post()获得结果并将其记录在控制台中。 - guest271314
很抱歉,但是*在问题中给出的javascript*是100%正确的 :) - Dekel
它不会,原因在于我的回答中。这就是为什么如果你想记录ajax请求的结果,你必须更改代码的原因。 - Dekel
显示剩余20条评论

0
$.post('../notify/notify.php', { notify: 1 },function(data){console.log(data);})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接