0

Я собираюсь добавить элемент в список sharepoint из приложения Apache Cordova. Сначала он запрашивает пользователя для входа в систему, после чего он сделает HTTP-сообщение таким образом, чтобы вводить данные.Вызов метода перед обещанием

У меня есть следующий код:

function saveToSharepoint(data) { 
    var authority = "https://login.microsoftonline.com/common/"; 
    var authContext = new Microsoft.ADAL.AuthenticationContext(authority); 
    var authResult = authContext.acquireTokenAsync("https://my.sharepoint.com", "4be098f8-2184-4831-9ef7-3d17dbbef6a0", "http://localhost:4400/services/office365/redirectTarget.html") 
    .then(FormatAndUpload(authResult, data), errorCallback); 

} 

function FormatAndUpload(authResponse, data) { 
    var token = authResponse.accessToken; 
    var expiry = authResponse.expiresOn; 
    console.log("Token acquired: " + authResponse.accessToken); 
    console.log("Token will expire on: " + authResponse.expiresOn); 
    $.ajax({ 
     url: "https://my.sharepoint.com/_api/web/lists/getbytitle('" + Test + "')/items", 
     type: "POST", 
     contentType: "application/json;odata=verbose", 
     data: JSON.stringify(data), 
     headers: { 
      "Accept": "application/json;odata=verbose", 
      "Authoriztion":"Bearer " + token 
     }, 
     success: function (data) { 
      success(data); 
     }, 
     error: function (data) { 
      failure(data); 
     } 
    }); 
} 

Проблема, которую я имею, что метод FormatAndUpload вызывается перед тем acquireTokenAsync завершена, так что переменная authResponse передается в метод FormatAndUpload равна нулю.

Я не слишком знаком с рамкой обещания в Javascript/JQuery, но у меня создалось впечатление, что событие должно срабатывать только по завершении предыдущего метода.

У кого-нибудь есть указатели на то, как я могу правильно подождать, когда логин будет завершен, прежде чем пытаться выполнить POST?

ответ

1

что вы сделали FormatAndUpload (authResult, data); это неправильно
правильный способ передать функцию обратного вызова является

.then(function(authResult){ 
    FormatAndUpload(authResult, data); 
}, errorCallback); 

так что ваш saveToSharepoint будет так

function saveToSharepoint(data) { 
    var authority = "https://login.microsoftonline.com/common/"; 
    var authContext = new Microsoft.ADAL.AuthenticationContext(authority); 
    var authResult = authContext.acquireTokenAsync("https://my.sharepoint.com", "4be098f8-2184-4831-9ef7-3d17dbbef6a0", "http://localhost:4400/services/office365/redirectTarget.html") 
    .then(function(authResult){ 
     FormatAndUpload(authResult, data); 
    }, errorCallback); 

} 
0

Спасибо за ответ Newbee Dev, вы были правы в том, что я не сформулируем то метод правильно.

Для любых других, которые видят это в отношении SharePoint, я на самом деле переформатировать код для того, чтобы работать, как ожидалось, поэтому метод saveToSharepoint выглядит так:

function saveToSharepoint(data) { 
var AuthenticationContext = Microsoft.ADAL.AuthenticationContext; 
AuthenticationContext.createAsync("https://login.microsoftonline.com/common/") 
    .then(function (authContext) { 
     authContext.acquireTokenAsync(
      "https://my.sharepoint.com",  // Resource URI 
      "4be098f8-2184-4831-9ef7-3d17dbbef6a0",  // Client ID 
      "http://localhost:4400/services/office365/redirectTarget.html" // Redirect URI 
     ).then(function (authResult) { 
      FormatAndUpload(authResult, data); 
     }, function (err) { 
      console.log(err); 
     }); 
    }, function (err) { 
     console.log(err); 
    }); 
} 

Главное внимание является создание AuthenticationContext асинхронно и таким образом, вызовы FormatAndUpload после завершения всего процесса входа в систему. Просто подумал, что я опубликую это для других людей, которые видят это в отношении Sharepoint и застревают.

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

  • Нет связанных вопросов^_^