Отложить SP.RequestExecutor.ExecuteAsync
-
10-12-2019 - |
Вопрос
Я работаю над приложением SharePoint, где мне нужно запустить SP.RequestExecutor.executeAsync()
для того, чтобы получить некоторую информацию из одного из списков хостинга в Интернете.В зависимости от того, какой метод вызывает вызов OData, я хочу сделать что-то другое.
К сожалению,, executor.executeAsync()
играть не так приятно, как $.ajax()
делает с точки зрения использования $.when().done()
и выполняющий код после выполняется асинхронный вызов.Ниже приведен некоторый код, если вы хотите его увидеть:
load = function (){
$.when(getEntries()).done(function () {
ViewModels.Calendar.addEventSource(ko.utils.unwrapObservable(eventList));
});
}
getEntries = function () {
return executor.executeAsync({
url: appweburl
+ "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + LIST + "')/items?@target='" + hostweburl
+ "'&$select=Title,OData__x006e_ot5,qnlu,OData__x0066_x20"
+ "&$filter=OData__x0066_x20 eq '" + ViewModels.Person.user.userName() + "' "
+ "and qnlu ge DateTime'" + startDate().toString("yyyy-MM-dd") + "T00:00:00' "
+ "and qnlu le DateTime'" + endDate().toString("yyyy-MM-dd") + "T00:00:00' ",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: onGetEntriesSuccess,
error: onoDataCallFailure
});
},
onGetEntriesSuccess = function (data) {
var jsonObject = JSON.parse(data.body);
$.each(jsonObject.d.results, function (index, item) {
eventList.push(new Event(item.qnlu, item.OData__x006e_ot5));
});
},
onoDataCallFailure = function (data, errorCode, errorMessage) {
alert('Failed to get host site. Error:' + errorMessage);
};
Будем признательны за любые идеи / предложения.
Решение
Создайте новый .Отложенный.Возврат отложен.обещание из вызова.Вызовите Deferred.resolve или Отложенный.Отклонить в обработчиках success и failure.
Другие советы
Чтобы добавить некоторые детали к ответу Скотта, вы могли бы сделать что-то вроде этого:
function load () {
var call = getEntries();
call.done(function (eventList) {
ViewModels.Calendar.addEventSource(ko.utils.unwrapObservable(eventList));
});
}
function getEntries () {
// create the deferred object
var def = new $.Deferred();
executor.executeAsync({
url: appweburl
+ "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + LIST + "')/items?@target='" + hostweburl
+ "'&$select=Title,OData__x006e_ot5,qnlu,OData__x0066_x20"
+ "&$filter=OData__x0066_x20 eq '" + ViewModels.Person.user.userName() + "' "
+ "and qnlu ge DateTime'" + startDate().toString("yyyy-MM-dd") + "T00:00:00' "
+ "and qnlu le DateTime'" + endDate().toString("yyyy-MM-dd") + "T00:00:00' ",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: onGetEntriesSuccess,
error: onoDataCallFailure
});
function onGetEntriesSuccess (data) {
var jsonObject = JSON.parse(data.body);
var eventList = [];
$.each(jsonObject.d.results, function (index, item) {
eventList.push(new Event(item.qnlu, item.OData__x006e_ot5));
});
// resolve the deferred object
// eventList will be passed as parameter to done
def.resolve(eventList);
}
function onoDataCallFailure (data, errorCode, errorMessage) {
// reject the deferred object
def.reject('Failed to get host site. Error:' + errorMessage);
}
// return the promise
return def.promise();
}