0

我试图从Apache Cordova应用程序中将项目添加到共享点列表。它首先提示用户登录,然后它会创建一个HTTP Post来输入数据。在Promise完成之前调用方法

我有以下代码:

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); 
     } 
    }); 
} 

我遇到的问题是,acquireTokenAsync完成之前被称为FormatAndUpload方法,所以传递到FormatAndUpload方法authResponse变量为空。

我不太熟悉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开发,你是正确的,我并没有制定然后方法正确。

对于谁看到这方面的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的其他人,并卡住了。

相关问题