2016-01-28 37 views
0

我有一個名爲loadPosts的jQuery函數,它接受三個參數skip,take和container。跳過告訴MVC Json調用要跳過多少個帖子,take表示要使用的帖子數量,容器是寫入帖子的元素。第一個jQuery ajax調用與第二個碰撞

function loadPosts(skip, take, container) { 
    $.ajax({ 
     url: '/Ajax/LoadPosts', 
     type: 'POST', 
     dataType: 'json', 
     data: { skip: skip, take: take }, 
     success: function (posts) { 
      if (posts == null) { 
       return; 
      } 
      var items = ''; 
      $.each(posts, function (p, post) { 
       items += ...; 
      }); 

      alert(items); 

      var $itemBlock = $(items); 
      container.append($itemBlock); 
      container.imagesLoaded(function() { 
       container.masonry('appended', $itemBlock); 
      }); 

      return; 
     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      console.log(xhr.status); 
      console.log(xhr.responseText); 
      console.log(thrownError); 
      return; 
     } 
    }); 
} 

該方法在頁面加載時調用兩次;首先加載最新的帖子(skip = 0,take = 10),然後加載完整的帖子集(skip = pageIndex * pageSize,take = pageSize)。

$(document).ready(function() { 
    if ($('#post-container') && $('#recent-container')) { 
     var skip = (pageIndex * pageSize); 
     var take = pageSize; 

     var $postContainer = $('#post-container'); 
     loadPosts(skip, take, $postContainer); 

     var $recentPostContainer = $('#recent-container'); 
     loadPosts(0, 10, $recentPostContainer); 

    } 
} 

,本身各功能(如果我註釋掉其中的一個)將正常工作。只有當我運行這兩個函數時,我會遇到兩個例外中的一個。

1. ExecuteReader requires an open and available Connection. The connection's current state is connecting. 
2. There is already an open DataReader associated with this Command which must be closed first. 

下面是功能

public static bool Get(int skip, int take, ListSortDirection direction, out List<Post> posts) 
{ 
    try 
    { 
     posts = Db.Posts.OrderBy(p => p.DateTimeCreated, direction).Skip(skip).Take(take).ToList(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     posts = new List<Post>(); 
     return false; 
    } 
} 

我認爲正在發生的是,第一個有機會完成之前,第二個實例開始。我想要做的是找到一種方法,等到第一個完成之後再開始。

任何幫助將不勝感激。 謝謝!

回答

2

返回$.ajax內部返回的承諾。

function loadPosts(skip, take, container) { 
    return $.ajax({ /* options left out for brevity */}) 
} 

然後可以使用一審承諾回調初始化第二

loadPosts(skip, take, $postContainer).done(function(){ 
    loadPosts(0, 10, $recentPostContainer); 
}); 
+0

這奏效了!謝謝! –

+1

簡單而無痛!很高興它幫助 – charlietfl

+1

請注意,如果第一次失敗...第二不會被調用,但你有錯誤處理函數。無論如何,如果你希望第二個射擊,可以使用'finally'而不是'done' – charlietfl

相關問題