2015-07-09 4 views
0

Прежде всего извините за плохой титул, просто не могу придумать ничего лучше.Как вызвать executeQueryAsync несколько раз

Я очень новичок в JavaScript, что может быть единственной причиной, по которой я просто этого не понимаю - пожалуйста, не взорвите меня.

То, что я хочу сделать, это просто запрос множественного Sharepoint списков (возможно, даже несколько раз ) из Sharepoint сайта с помощью JavaScript Client Object Model. Мне удалось найти много рабочих примеров в Интернете, как извлекать данные из списка и работать с ним. Но я так не знаком с концепциями асинхронного и обратного вызова, что я не могу передать эту концепцию моим потребностям. Действительно ли мне нужно скопировать все переменные и функции x раз?

Вот что я для одного звонка:

var listAItems; 

$(document).ready(function() {  
    ExecuteOrDelayUntilScriptLoaded(LoadChartData, "sp.js"); 
}); 

function LoadChartData() { 
    context = SP.ClientContext.get_current(); 
    var listA = context.get_web().get_lists().getByTitle("ListA"); 
    var camlQuery = SP.CamlQuery.createAllItemsQuery(); 
    this.listAItems = listA.getItems(camlQuery); 

    context.load(listAItems); 
    context.executeQueryAsync(ReadListAItemSucceeded, ReadListItemFailed); 
} 

function ReadListAItemSucceeded(sender, args) { 
    var listAItemsCollection = listAItems.getEnumerator(); 

    while (listAItemsCollection.moveNext()) { 
    var listAItem = listAItemsCollection.get_current(); 
    //do something with each listItem 
    } 
} 

function ReadListItemFailed(sender, args) { 
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); 
} 

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

var listAItems; 
var listBItems; 

$(document).ready(function() {  
    ExecuteOrDelayUntilScriptLoaded(LoadChartData, "sp.js"); 
}); 

function LoadChartData() { 
    context = SP.ClientContext.get_current(); 
    var listA = context.get_web().get_lists().getByTitle("ListA"); 
    var camlQuery = SP.CamlQuery.createAllItemsQuery(); 
    this.listAItems = listA.getItems(camlQuery); 

    context.load(listAItems); 
    context.executeQueryAsync(ReadListAItemSucceeded, ReadListItemFailed); 

    context2 = SP.ClientContext.get_current(); 
    var listB = context.get_web().get_lists().getByTitle("ListB"); 
    var camlQuery2 = SP.CamlQuery.createAllItemsQuery(); 
    this.listBItems = listB.getItems(camlQuery2); 

    context2.load(listBItems); 
    context2.executeQueryAsync(ReadListBItemSucceeded, ReadListItemFailed); 
} 

function ReadListAItemSucceeded(sender, args) { 
    var listAItemsCollection = listAItems.getEnumerator(); 

    while (listAItemsCollection.moveNext()) { 
    var listAItem = listAItemsCollection.get_current(); 
    //do something with each listItem 
    } 
} 

function ReadListBItemSucceeded(sender, args) { 
    var listBItemsCollection = listBItems.getEnumerator(); 

    while (listBItemsCollection.moveNext()) { 
    var listBItem = listBItemsCollection.get_current(); 
    //do something with each listItem 
    } 
} 

function ReadListItemFailed(sender, args) { 
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); 
} 

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

спасибо, что заблаговременно!

+0

Почему йо u не использовать один контекст и загружать его с помощью 'listAItems' и' listBItems'? –

+0

@ DanielB, спасибо за комментарий! Причиной могут быть неправильные предположения. Я сделал это, потому что auf глобальная переменная, которая передается методу context.load и доступна в обратном вызове успеха для получения перечислителя. – Toby

ответ

4

Асинхронного понятия не сложно, вы должны думать: «это сделать, и когда вы закончите называть эту функцию», концепция затем применяются к видимости переменных, в JavaScript это называется closure

В ваш код вы можете сделать это (предупреждение, я не тестировал код ниже)

$(document).ready(function() {  
    ExecuteOrDelayUntilScriptLoaded(loadChartData, "sp.js"); 
}); 

function loadChartData() { 
    loadListData("listA", listASuccess, globalError); 
    loadListData("listB", listBSuccess, globalError); 
} 

function loadListData(listName, onSuccess, onFail) { 
    context = SP.ClientContext.get_current(); 
    var list = context.get_web().get_lists().getByTitle(listName); 
    var camlQuery = SP.CamlQuery.createAllItemsQuery(); 
    var listItems = list.getItems(camlQuery); 

    context.load(listAItems); 

    context.executeQueryAsync(
     function(sender, args) { 
      // listItem is defined on same closure, you do not need to declare globally 
      onSuccess(listItems); 
     }, 
     onFail 
); 

} 

function listASuccess(data) { 

    var listAItemsCollection = data.getEnumerator(); 

    while (listAItemsCollection.moveNext()) { 
    var listAItem = listAItemsCollection.get_current(); 
    //do something with each listItem 
    } 

    // You can use also forEach like this 
    // data.forEach(function(listItem) { 
    // //do something with each listItem 
    // }); 
} 

function listBSuccess(data) { 

    var listBItemsCollection = data.getEnumerator(); 

    while (listBItemsCollection.moveNext()) { 
    var listBItem = listBItemsCollection.get_current(); 
    //do something with each listItem 
    } 

    // You can use also forEach like this 
    // data.forEach(function(listItem) { 
    // //do something with each listItem 
    // }); 
} 

function globalError(sender, args) { 
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); 
} 

См closure См forEach

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