javascript - 在 AJAX 调用中循环 PHP 时保持实时日志
问题描述
我正在创建一个 Wordpress 插件来调用 API 并为响应中返回的每个对象创建新的 Wordpress 帖子。这是我的函数的 PHP,它遍历 API 响应以创建新的 Wordpress 帖子:
add_action('wp_ajax_sync_posts', 'sync_posts_from_api' );
function sync_posts_from_api() {
// MAKING API CALL HERE
foreach ($data as $post) {
$new_post = array(
'post_type' => 'post',
'post_title' => $post->title,
'post_status' => 'publish',
'post_author' => 1,
'post_content' => $post->description,
);
$wp_post = wp_insert_post($new_post);
echo '<pre>Post ID ' . $wp_post->ID . ') has been created.</pre>';
}
}
然后我有这样的Javascript:
jQuery(function($) {
$('form').submit(function(e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: ajaxurl,
data: {
action: 'sync_posts'
},
}).done(function(response) {
$('.log').html(response);
});
});
});
这在 AJAX 调用完全完成后有效,但我希望能够在容器运行时将每个附加echo
到.log
容器中,而不是在调用完成时一次全部附加到容器中。我将如何进行这种改变?
解决方案
您只能在请求完成后访问 ajax 请求响应。完成您想要的正确方法是使用web sockets。
在过去,我们使用这样的方式创建 iframe 加载:
foreach ($data as $post) {
echo "
<script>
window.parent.postMessage({message: '".$post."'}, 'http://localhost/');
</script>
";
flush();
}
浏览器在加载页面时实时执行js,js向父框架发送消息。您还需要父框架上的正确 js 代码来接收和处理这些帖子。尽管这可能仍然有效,但它非常粗略,不推荐。
推荐阅读
- node.js - Puppeteer 在 docker 容器中使用鼠标时没有移动鼠标
- amazon-web-services - 我可以使用 cloudfront 为 Elastic Beanstalk 重用我的 S3 自定义域吗
- flutter - 错误:参数类型“对象?” 不能分配给参数类型“字符串?”
- webpack - 如何根据我使用 MiniCssExtractPlugin for Webpack 导入的 CSS 文件名指定不同的输出文件夹
- javascript - 使用脚本将 Google 电子表格导出为 JSON
- flutter - 状态管理与消费者和脚手架状态
- python - 如何下载 mp3 格式的视频?
- ruby-on-rails - (PG::UndefinedColumn: 调用 current_user.games 时出错
- javascript - 如何在条件循环内写入 Google App Scripts 中特定行的单元格?
- java - Micronaut 未通过 @Value 注释获取配置值