为什么在调用JSOM executeQueryAsync时我的jQuery Promise被忽略了?

时间:2013-04-24 09:26:07

标签: jquery sharepoint-2013

我对jQuery Promises的一个小问题感到头疼。基本上我试图链接几个方法调用(在插件中保存),以便按顺序调用它们。

但是因为其中一个函数有一个SP context.executeQueryAsync调用,所以当我尝试这个时,他们似乎被调用了最终方法,而不是在继续之前等待promise的已解析状态。

我在下面的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 个答案:

答案 0 :(得分: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/