2

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

但是,因为其中一个函数有一个 SP context.executeQueryAsync 调用,所以当我尝试这个时,它们似乎被调用了 final 方法,而不是在继续之前等待 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 示例相同的方式调用我的函数。任何帮助将非常感激!

4

1 回答 1

1

以下不会等待执行 MyPromiseTest 函数:

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

试试这样

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

编辑:

你也可以使用.pipe来更新 promise(从 1.8 开始你应该使用.then):

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

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

于 2013-04-24T09:48:45.030 回答