延迟动态更新以从DB获取正确的值


Delaying a dynamic update to get the correct value from DB

我有这个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/