2013-04-24 61 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