0

我的应用程序中有两个 javascript/jquery 函数,总是有 refresh() 函数,它从数据库中获取数据并重绘前端视图。

一种方法是将数据发送到 PHP 函数中,该函数可以简单地插入 MySQL 数据库,然后对其进行编辑,在这里它们是(它们是相同的,所以我只发布一个):

function insertedit()
{
$('.res').each(function()
{
    $.post("/controller/method/",{id: id},function(data,status,xhr)
    {
        if(status=="success")
        {
        }
    })
});     

refresh();
}

当我尝试使用此功能插入数据时,一切正常,并且我的视图正在异步重绘,但是当我尝试使用它编辑数据时 - 我必须刷新页面才能看到更新的视图。我认为,该编辑操作比插入和我的刷新功能需要更多的时间,它从 SQL 中抓取数据只是抓取旧数据(未删除的记录) - 我该如何修复它?

编辑

$(function()
{
 refresh();
});



function insertedit(){
  var $promises = [];
  $('.res').each(function()
  {

    $promises.push(
    $.post("/controller/metgod/",{id, id},function(data,status,xhr)
    {
        if(status=="success")
        {
        }
    })
    );
});     

$.when.apply($, $promises).then(function() {
    refresh();
});
}
4

2 回答 2

4

使用承诺

function insertedit()
{
  var $promises = [];

  $('.res').each(function(id){
    var $this = $(this);

    $promises.push(
      $.post("/controller/method/", {'id': $this.attr('id')}, function(data,status,xhr){
        $this.text(data); // success
      })
    );
  });

  $.when.apply($, $promises).then(function(){
    refresh();
  });     
}

在这里查看小提琴,它可以工作http://jsfiddle.net/69eMp/4/

于 2012-12-29T02:04:21.140 回答
2

我曾经使用过这样的解决方案,这是我的解决方案(这里有一个现场演示

/**
 * Class that will handle delayed function calls
 * @param fn     the funciton to call
 * @param ctx    the context to use as 'this' inside the function
 * @param delay  delay in millis
 */
var AsyncCall= function(fn, ctx, delay) {
   var timer = null;

   ctx   = ctx || window;
   delay = delay || 1;

   return function() {
       // prevent calling the delayed function multiple times
       if (timer) clearTimeout(timer);

       var args = arguments;

       timer = setTimeout(function() {
          timer = null;
          fn.apply(ctx, args);
       }, delay);
   };
};

// wrap the 'refresh' funciton inside the async call object with a 200 millis delay
var refreshAsync = new AsyncCall(refresh, null, 200);

function insertedit()
{
$('.res').each(function()
{
    $.post("/controller/method/",{id: id},function(data,status,xhr)
    {
        if(status=="success")
        {
        }

        // schedule calling 'refresh'
        refreshAsync();
    })
});
}

首选此方法的原因是您不必刷新每个 Ajax 请求。refresh这样,与每次刷新相比,它只会执行更少的功能。并且 200 毫秒不是那么长,但足以让 Ajax 调用返回,并且不会被用户注意到。

于 2012-12-29T01:42:36.163 回答