четверг, 25 июня 2015 г.

Полезности под рукой: Ожидание executeQueryAsync в CSOM

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


Так как /_api в SharePoint развивается и сам MS говорит, чтобы мы использовали больше конструкции ajax, но иногда не все можно сделать через _api и приходится использовать CSOM.

Многие из вас использую загрузку SP.ClientContext => Web=> List => Item к примеру, и потом загружают контексты через executeQueryAsync.

И если у меня уже есть JQuery и мне нужно что-то извлекать при помощи CSOM, то я использую вот такую конструкцию. Для примера.

function getWhatever(url, listId, itemId) {
  var d = $.Deferred();
  var context = new SP.ClientContext(url);
  var web = context.get_web();
  var list = web.get_lists().getById(listId);
  var item = list.getItemById(itemId);
  context.load(web);
  context.load(list);
  context.load(item);

  var o = {
    d: d,
    item: item,
    web: web,
    list: list
  };

  context.executeQueryAsync(Function.createDelegate(o, this.successCallback), Function.createDelegate(o, this.failCallback));
  return d.promise();
}
successCallback = function () {
  this.d.resolve(this);
}
failCallback = function (sender, args) {
  this.d.reject(sender, args);
}

function Test() {
  var getMyWhatever = getWhatever({ ваш url}, { ваш listId}, { ваш itemId});
  getMyWhatever.then(function (data) {
    console.log(data);
  });
И в консоле вернется вами запрошенный объект с контекстами элементов.

Очень удобно в таких конструкциях:

function getItemFromExternalWeb(url, listId, itemId) {
    var d = $.Deferred();
    var context = new SP.ClientContext(url);
    var web = context.get_web();
    var list = web.get_lists().getById(listId);
    var item = list.getItemById(itemId);
    var o = { d: d, item: item };
    context.load(item);
    context.executeQueryAsync(Function.createDelegate(o, successCallback), Function.createDelegate(o, failCallback));
    return d.promise();
  }

Комментариев нет:

Отправить комментарий