javascript - SharePoint JavaScript 执行一个又一个异步函数

标签 javascript function sharepoint

我有许多函数可以从 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/

相关文章:

c# - 如何为 SharePoint 网站中的任何更改创建每日摘要警报

c# - 如何在 WebBrowser 控件中注入(inject) Javascript?

javascript - 如何将纯 JavaScript 帮助程序类导入 React?

c++ - 在函数调用中使用构造函数?

c# - Microsoft.SharePoint.Client 命名空间 - 无法识别 Sharepoint 命名空间

asp.net - 在 Sharepoint 设计器中搜索

javascript - 在 li 悬停时更改背景图像;当我得到 li 时如何更改回来?

javascript - 单击按钮时添加 HTML 表单

Python OOP对象打印属性问题

r - 嵌套函数中的省略号扩展 : Error "..3 used in an incorrect context, no ... to look in"