2017-07-25 83 views
1

我正在将AngularJS应用程序转换为从SharePoint获取一些数据的Angular 4。它使用JSOM,并使用executeQueryAsync()方法。转换AngularJS承诺JSOM的AngularX observable

我想从服务器获取executeQueryAsync()的数据,并将其存储在服务中的observable中。我必须从旧版本(这不是我)转换的代码如下。现在我在将它转换为我的服务时遇到了语法问题。我绝对没有计划如何将此转化为角4

getAllStatusReps($scope) { 
 
    const deferred = $q.defer(); 
 

 
    const ctx = SP.ClientContext.get_current(); 
 
    const web = ctx.get_web(); 
 

 
    const statusList = web.get_lists().getByTitle(this.statusListName); 
 
    const twitterList = web.get_lists().getByTitle(this.twitterListName); 
 

 
    const statReps = statusList.getItems(this.getQueryForAllStatusReps()); 
 
    const twitReps = twitterList.getItems(this.getQueryForAllStatusReps()); 
 
    const queryText = ` 
 
     <View> 
 
     <RowLimit>1</RowLimit> 
 
     <ViewFields>{0}</ViewFields> 
 
     <Query> 
 
      <Where><IsNotNull><FieldRef Name=\'EPMStatusDate\' /></IsNotNull></Where> 
 
      <OrderBy><FieldRef Name=\'ID\' Ascending= \'False\' /></OrderBy> 
 
     </Query> 
 
     </View>`; 
 

 
    const statCamlQuery = new SP.CamlQuery(); 
 
    statCamlQuery.set_viewXml(String.format(queryText, this.getViewFields(true, false))); 
 
    const lastStatRep = statusList.getItems(statCamlQuery); 
 

 
    const twitCamlQuery = new SP.CamlQuery(); 
 
    twitCamlQuery.set_viewXml(String.format(queryText, this.getViewFields(false, false))); 
 
    const lastTwitRep = twitterList.getItems(twitCamlQuery); 
 

 
    ctx.load(statReps); 
 
    ctx.load(twitReps); 
 

 
    ctx.load(lastStatRep); 
 
    ctx.load(lastTwitRep); 
 

 
    ctx.executeQueryAsync(
 
     function() { 
 
     deferred.resolve({ 
 
      statReps: statReps, 
 
      twitReps: twitReps, 
 
      lastStatRep: lastStatRep, 
 
      lastTwitRep: lastTwitRep 
 
     }); 
 
     }, 
 
     function (sender, args) { 
 
     deferred.reject('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); 
 
     } 
 
    ); 
 

 
    return deferred.promise; 
 
    }

回答

0

您可以通过执行转换承诺可观:

const $thingWhichYouCanSubscribeTo = Observable.fromPromise(serviceOrThingThatReturnsPromise()) 

也可以在底部在那里试试这个您退货承诺:

return Observable.fromPromise(deferred.promise); 

T母鸡你可以这样做:

getAllStatusReps($scope).subscribe(()=>{...},()=>{...}) 

而且你可以只使用可观测重新编写,并创建一个返回一个新的观察的一个服务: