2013-04-24 34 views
2

我在用jQuery Promises遇到的一個小問題上摸不着頭腦。基本上我試圖鏈接幾個方法調用(在一個插件中保存),以便它們按順序調用。爲什麼我的jQuery Promise在調用JSOM executeQueryAsync時被忽略?

但是,因爲其中一個函數有一個SP context.executeQueryAsync調用,所以當我嘗試這樣做時,他們似乎用最後一個方法調用,而不是等待承諾的已解決狀態,然後再繼續。

我已經複製類似於我使用超時做,在下面的jsfiddle東西:

http://jsfiddle.net/qPHmu/11/

下面是使用executeQueryAsync調用該方法的基本版本:

GetList: function (listTitle, fields, camlXml) { 
       var dfd = new $.Deferred(); 
       $this = $(this); 

       var data = $this.data('SPLists'); 

       if (!data) { 
        var list = web.get_lists().getByTitle(listTitle); 
        var query = new SP.CamlQuery(camlXml); 
        var items = list.getItems(query); 

        context.load(items, 'Include (' + fields + ')'); 
        context.executeQueryAsync(function() { 
         dfd.resolve(); 
        }, 
        function (sender, args) { 
         dfd.reject(); 
        }); 
       } 

       return dfd.promise(); 
     } 

我以與jsfiddle示例中相同的方式調用我的函數。任何幫助將非常感激!

回答

1

下不會等待與執行MyPromiseTest功能:

$.fn.MyPromiseTest() 
    .done($.fn.MyPromiseTest("Get")) 
     .done($.fn.MyPromiseTest("Final")); 

試試看like this

$.fn.MyPromiseTest() 
    .done(function() { 
     return $.fn.MyPromiseTest("Get").done(function() { 
      return $.fn.MyPromiseTest("Final"); 
     }) 
    }); 

編輯:

您還可以使用.pipe更新的承諾(從1.8開始,您應該使用.then):

$.fn.MyPromiseTest() 
    .pipe(function() { return $.fn.MyPromiseTest("Get"); }) 
    .pipe(function() { return $.fn.MyPromiseTest("Final"); }); 

http://jsfiddle.net/qPHmu/13/

+0

您好,感謝您的快速答覆! 這適用於超時JsFiddle示例,但不適用於jQuery之外的異步調用(SharePoint 2013 executeQueryAsync)。有任何想法嗎? – 2013-04-24 11:14:30