我为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/