我有许多函数可以从 SharePoint 列表中读取信息并在 SharePoint 列表中写入信息。这些函数相互依赖,例如,在第一个函数中,我在列表中写入信息。在第一个函数之后,我调用第二个函数来读取写入的信息。
为了读取和写入信息,我使用executeQueryAsync。
我的问题是因为异步数据在第一个函数将其写入列表之前被读取。
当我处理超时时,希望在超时结束时将信息写下来,然后我阅读它们。但这并不是一个很好的解决方案。 有没有一种方法可以逐个执行与executeQueryAsync配合使用的函数。
示例:
functionA(); // writes information in list A
functionB(); // reads and write information from list A
functionC(); // reads information from list A
我如何告诉函数互相等待?仅当一个函数完全执行时,下一个函数才会启动。
有人有想法吗?
非常感谢!
最佳答案
根据设计SP.ClientContext.executeQueryAsync
function
接受两个参数:
succeededCallback
要调用的函数或方法的委托(delegate),如果 请求成功执行。failedCallback
调用的函数或方法的委托(delegate),如果 请求执行失败。
鉴于这一事实,您可以考虑使用以下方法在上一个函数完成后执行下一个函数:
var ctx = SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getByTitle('Announcements');
var properties = {'Title' : 'New announcement',
'Body' : 'Welcome to a new site'};
var itemCreateInfo = new SP.ListItemCreationInformation();
var listItem = list.addItem(itemCreateInfo);
for(var name in itemProperties)
listItem.set_item(name, itemProperties[name]);
listItem.update();
ctx.load(listItem);
ctx.executeQueryAsync(
function(){
//execute next function here...
},
function(sender,args){
console.log(args.get_message());
});
<小时/>
或者,您可以考虑通过 Promise 以可链接的方式执行函数,例如使用 jQuery.Deferred
如下所示
function executeQueryPromise(ctx, result) {
result = result || {};
var d = jQuery.Deferred();
ctx.executeQueryAsync(function () {
d.resolve(result);
}, function (sender, args) {
d.reject(args);
});
return d.promise();
}
用法
var ctx = SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getByTitle('Announcements');
var properties = {'Title' : 'New announcement',
'Body' : 'Welcome to a new site'};
createListItem(list,properties)
.then(function(item){
return readListItems(list);
},logError)
.then(function(items){
console.log("Done");
},logError);
哪里
function logError(sender,args){
console.log(args.get_message());
}
function createListItem(list,itemProperties){
var ctx = list.get_context();
var itemCreateInfo = new SP.ListItemCreationInformation();
var listItem = list.addItem(itemCreateInfo);
for(var name in itemProperties)
listItem.set_item(name, itemProperties[name]);
listItem.update();
ctx.load(listItem);
return executeQueryPromise(ctx,listItem);
}
function readListItems(list){
var ctx = list.get_context();
var listItems = list.getItems(SP.CamlQuery.createAllItemsQuery());
ctx.load(listItems);
return executeQueryPromise(ctx,listItems);
}
关于javascript - SharePoint JavaScript 执行一个又一个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37614394/