我有这个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:理想情况下,这应该通过某种回调模式来完成。这可能吗?
EDIT:基于对问题的更新…
将ratePhotoById更改为:
function ratePhotoById( imageId ){
$.post(
"ImageRate.php",
{ ... },
function(data) {
// process
// console.log(data);
updateRating( $("#image").attr( 'id' ) );
});
}
并从click事件处理程序
中删除对updatating的调用老:我猜你是使用ajax来更新评级(通过ratePhotoById函数)。
将调用移动到updatating函数,作为ratePhotoById ajax调用中成功回调的一部分比如:
function ratePhotoById(elID){
$.ajax({
.
.
.
.
success: function(data){
updateRating( $("#image").attr( 'id' ) );
}
});
}
还可以返回递延的那个$。Ajax返回,这让您可以解耦一些东西。
function ratePhotoById( imageId ){
return $.post(
"ImageRate.php",
{ ... },
function(data) {
// process
// console.log(data);
}
);
}
那么你可以使用deferred's 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()。查看Deferred的文档获取更多信息:http://api.jquery.com/category/deferred-object/