2016-06-03 2 views
0

У меня есть много функций, которые читают информацию из списков SharePoint и записывают информацию в списки SharePoint. Эти функции зависят друг от друга, например, в первой функции я пишу информацию в списке. После этой первой функции я вызываю функцию secound, которая читает информацию о записи.SharePoint JavaScript Выполнение функций Asynchron после другого

Чтобы читать и писать информацию, я использую executeQueryAsync.

Проблема возникает из-за асинхронного чтения данных, прежде чем первая функция сможет записать ее в списке.

В тот момент, когда я работаю с таймаутами и надеюсь, что информация записывается, когда таймаут заканчивается, тогда я их читаю. Но это не очень хорошее решение. Есть ли способ, которым я могу выполнять функции, которые работают с executeQueryAsync один за другим.

Пример:

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

Как я могу сказать функции ждать друг от друга? Только если функция полностью выполнена, запускаются следующие функции.

У кого-нибудь есть идеи?

Большое спасибо!

ответ

0

Попробуйте вложить вызовы функций в методы success() предыдущего вызова. Это гарантирует, что функции не будут выполняться до завершения предыдущего.

0

Для обработки асинхронного вызова последовательным образом предоставляется условие jquery: Deferred (фабричная функция, которая возвращает цельный объект утилиты с методами для регистрации нескольких обратных вызовов в очереди обратного вызова, вызывает очереди обратного вызова и ретранслирует успех . или неуспех состояние любой синхронной или асинхронной функции)

ссылка ссылка: https://api.jquery.com/jquery.deferred/ http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

1

По дизайну SP.ClientContext.executeQueryAsync function принимает два параметра :

  • succeededCallback Функция или делегат метода вызова, если запрос выполняется успешно.
  • 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); 
} 
+0

у меня есть проблемы с пониманием ваш код немного. вы можете увидеть мой комментарий об этом? – 13reach

Смежные вопросы