SharePoint JavaScript执行异步功能

时间:2016-06-03 12:27:10

标签: javascript function sharepoint

我有许多函数可以从SharePoint列表中读取信息并在SharePoint列表中写入信息。这些函数彼此依赖,这意味着例如,在第一个函数中,我在列表中写入信息。在第一个函数之后,我调用了读取写入信息的secound函数。

要读取和写入信息,我使用executeQueryAsync。

我的问题是因为在第一个函数可以在列表中写入数据之前读取数据的异步。

在我处理超时并希望在超时结束时写下信息的那一刻,我就读了它们。但这不是一个很好的解决方案。 有没有办法可以执行与executeQueryAsync一起使用的函数。

示例:

functionA(); // writes information in list A
functionB(); // reads and write information from list A
functionC(); // reads information from list A

我如何告诉这些功能相互等待?只有在完全执行某个功能时,才会启动下一个功能。

有没有人有想法?

非常感谢!

3 个答案:

答案 0 :(得分:1)

按设计SP.ClientContext.executeQueryAsync function 接受两个参数

  • succeededCallback调用if的方法的函数或委托 请求成功执行。
  • failedCallback要调用的方法的函数或委托 请求无法执行。

鉴于这一事实,您可以考虑以下方法在前一个函数完成后执行下一个函数:

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);
}

答案 1 :(得分:0)

尝试在上一次调用的success()方法中嵌套函数调用。这将确保函数在前一个函数完成之前不会执行。

答案 2 :(得分:0)

为了以顺序方式处理异步调用,jquery提供了一个规定:Deferred(工厂函数返回一个可链接的实用程序对象,其方法是将多个回调注册到回调队列,调用回调队列,并转发成功或任何同步或异步函数的失败状态。)

参考链接:https://api.jquery.com/jquery.deferred/ http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/