我有这个jQuery代码对照片进行评级,然后在数据库中更新它的评级。函数updateRating
应该使用新的评级更新显示,但有时不会。我该怎么做才能确保显示正确的评级?
$("#rate").click(
function(){
ratePhotoById( $("#image").attr( 'id' ) );
updateRating( $("#image").attr( 'id' ) );
return false;
}
);
function ratePhotoById( imageId ){
$.post(
"ImageRate.php",
{ ... },
function(data) {
// process
// console.log(data);
}
);
}
P.S:理想情况下应该做某种回调模式。这可能吗?
答案 0 :(得分:2)
编辑:根据问题的更新...
将ratePhotoById更改为:
function ratePhotoById( imageId ){
$.post(
"ImageRate.php",
{ ... },
function(data) {
// process
// console.log(data);
updateRating( $("#image").attr( 'id' ) );
});
}
并从click事件处理程序中删除对updateRating的调用
<强> OLD:强> 我猜你使用ajax来更新评级(通过ratePhotoById函数)。
在ratePhotoById ajax调用中将调用更改为updateRating函数作为Success回调的一部分 类似的东西:
function ratePhotoById(elID){
$.ajax({
.
.
.
.
success: function(data){
updateRating( $("#image").attr( 'id' ) );
}
});
}
答案 1 :(得分:1)
您还可以返回$ .ajax返回的延迟,这可以让您稍微分解一下。
function ratePhotoById( imageId ){
return $.post(
"ImageRate.php",
{ ... },
function(data) {
// process
// console.log(data);
}
);
}
然后你可以使用deferred的done(cb)方法。这将使用AJAX请求的结果调用回调函数,无论它已经返回还是将返回静止。
$("#rate").click(function(){
ratePhotoById( $("#image").attr( 'id' ) ).done(function() {
// excuted after ratePhotoById() has completed successfully.
updateRating( $("#image").attr( 'id' ) );
});
return false;
});
Deferred对象还有一些其他很好的方法,比如fail()和pipe()。有关详细信息,请查看延期文档:http://api.jquery.com/category/deferred-object/