在不得不更改我的回调语法以适应 Firefox 限制之后,我遇到了一些奇怪的问题。
标记+执行代码
function List_Add() {
SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {
var listTitle = 'Quote';
var propertiesToAdd = [];
propertiesToAdd.push({
ID: "Q_ID",
newval: 1,
});
addListItems(listTitle, propertiesToAdd)
.done(function(items) {
//Do Heaps of Stuff
})
.fail(function(error) {
console.log(error.get_message());
});
});
}
以及被调用来执行此操作的函数
function addListItems(listTitle, propertiesToAdd) {
var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle(listTitle);
var listItemCreationInfo = new SP.ListItemCreationInformation();
var newItem = list.addItem(listItemCreationInfo);
propertiesToAdd.forEach(function(entry) {
newItem.set_item(entry.ID, entry.newval);
});
newItem.update();
var d = $.Deferred();
ctx.executeQueryAsync(function() {
d.resolve(true);
return d.promise();
},
function(sender, args) {
d.reject(args);
return d.promise();
});
}
通常在函数之外返回 d.promise 会导致异步执行的计时问题。
运行此代码后收到的错误被标记 + 执行抛出
未捕获类型错误:无法读取未定义的属性“完成”
这些值已正确添加到列表中,因此批量工作正常,但 .done 未返回,但因此不允许执行后续代码。
最佳答案
您的 return d.promise();
需要进入外部函数,而不是内部回调。无论内部异步执行的回调返回什么值,都不会影响外部函数的返回值。
function addListItems(listTitle, propertiesToAdd) {
// ...
var d = $.Deferred();
ctx.executeQueryAsync(function() {
d.resolve(true);
},
function(sender, args) {
d.reject(args);
}
);
return d.promise();
}
关于javascript - jQuery Promise 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35422673/