我对jQuery Promises的一个小问题感到头疼。基本上我试图链接几个方法调用(在插件中保存),以便按顺序调用它们。
但是因为其中一个函数有一个SP context.executeQueryAsync调用,所以当我尝试这个时,他们似乎被调用了最终方法,而不是在继续之前等待promise的已解析状态。
我在下面的jsFiddle中复制了类似于我正在使用超时的内容:
以下是使用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示例相同的方式调用我的函数。任何帮助将不胜感激!
答案 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"); });