我为jQuery Promises遇到的一个小问题scratch之以鼻。基本上,我试图链接多个方法调用(保存在插件中),以便依次调用它们。

但是,由于其中一个功能具有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示例相同的方式调用函数。任何帮助将非常感激!

最佳答案

以下将不等待执行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来更新Promise(从1.8开始,您应该使用.then):

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


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

09-20 23:48