【发布时间】:2010-11-05 08:12:14
【问题描述】:
我将从头开始。 我正在构建一个具有双重职责的 wordpress 插件,因为它可以通过简码插入到帖子中,或者作为侧边栏小部件添加。它所做的只是输出一些 js 来向本地 php 文件发出 jquery.post 请求。本地 php 文件向 web 服务发出请求以获取某些数据。 (我不得不这样做,而不是直接使用 jquery.ajax 查询 Web 服务,因为 URL 包含一个许可证密钥,如果放入 js 中该密钥将是公开的)。
无论如何,当我在 wordpress 博客中查看具有侧边栏小部件和通过简码输出的插件的页面时,只有一个请求有效。我的意思是它的工作原理是它从 php 脚本得到响应。页面加载后,如果手动告知,它们都可以正常工作。
网页视图 -> 向我的 php 脚本发送 2 个 post 请求 -> 两个元素都应提交,但只有一个。
我的 php 脚本只是:
<?php
if(isset($_POST["zip"])) {
// build a curl object, execute the request,
// and basically just echo what the curl request returns.
}
?>
非常基本。
这里有一些人想看的js:
function widget_getActivities( zip ){
jQuery("#widget_active_list").text("");
jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip},
function(text) {
jQuery(text).find("asset").each(function(j, aval){
var html = "";
html += "<a href='" + jQuery(aval).find("trackback").text() + "' target='new'> " + jQuery(aval).find("assetName").text() + "</a><b> at </b>";
jQuery("location", aval).each(function(i, val){
html += jQuery("locationName", val).text() + " <b> on </b>";
});
jQuery("date", aval).each(function(){
html += jQuery("startDate", aval).text();
<!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");-->
jQuery("#widget_active_list")
.append(jQuery("<div>")
.addClass("widget_ActivityEntry")
.html(html)
.bind("mouseenter", function(){
jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50);
})
.bind("mouseleave", function(){
jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50);
})
);
});
});
});
}
现在想象有另一个与这个相同的函数,除了前面带有“widget_”的所有内容都没有前面。这两个函数通过以下方式分别调用:
jQuery(document).ready(function(){
w_zip = jQuery("#widget_zip").val();
widget_getActivities( w_zip );
jQuery("#widget_updateZipLink").click(function() { //start function when any update link is clicked
widget_c_zip = jQuery("#widget_zip").val();
if (undefined == widget_c_zip || widget_c_zip == "" || widget_c_zip.length != 5)
jQuery("#widget_zipError").text("Bad zip code");
else
widget_getActivities( widget_c_zip );
});
})
我可以在我的 apache 日志中看到两个请求都在发出。 我猜这是某种竞争条件,但这没有任何意义。 我对这一切都很陌生,有什么想法吗?
编辑:我想出了一个次优的解决方案。我让我的小部件检测页面上是否也在使用插件,如果是,它会在执行请求之前等待 3 秒。但是我有一种感觉,如果多个客户端同时执行一个页面请求,触发对我的 php 脚本的请求之一,那么同样的事情将会发生,因为我相信问题出在 php 脚本中,这很可怕。
【问题讨论】:
-
很难说没有更多信息或代码。你可以在Firefox下使用Firebug的Net面板查看浏览器发送和接收的流量(包括请求/响应头),非常方便调试Ajax。
-
我使用了 firebug,我的 php 脚本返回 200 OK,但其中一个没有内容长度……我不知道那是什么意思。令人惊讶的是,他们都返回了一个有效的响应,所以看起来 jquery.post 以某种方式被阻塞了。
标签: php jquery wordpress plugins asynchronous