2017-12-18 127 views
0

讀取屬性「然後」未定義我對這個方法上面的錯誤:不能在承諾

function addContentType(listItem){ 
       var promise = getContentTypeOfCurrentItem(listItem.ID.toString()); 
       promise.then(function(cname){ 
        listItem['Document Type'] = cname; //we add the doc type to each listItem, not only the last one 
       }); 
       return promise; 
      } 

整個代碼是在這裏:

function GetRelatedBillingDocumentsFromList(selectProperties, currentBillCyclePath, clientCode, jobCodes, engagementCode, enhanceFunctions) { 
       $log.info("Retrieving related billing documents for bill cycle with name [" + currentBillCyclePath + "]");     
       var deferred = $q.defer(); 
       var webUrl = _spPageContextInfo.webAbsoluteUrl; 
       var viewFields = spService.ConvertSelectPropertiesToViewFields(selectProperties); 
       // query must return the documents for the same client but in other bill cycles not the current one 
       var camlQuery = '<View Scope="RecursiveAll">' + viewFields + 
         '<Query>' + 
          '<Where>' + 
           '<And>' + 
            '<Eq>' + 
             '<FieldRef Name="ClientCode" />' + 
             '<Value Type="Text">'+ clientCode + '</Value>' + 
            '</Eq>' + 
            '<Neq>' + 
             '<FieldRef Name="ContentType" />' + 
             '<Value Type="Computed">Bill Cycle</Value>' + 
            '</Neq>' + 
           '</And>' + 
          '</Where>' + 
         '</Query>' + 
        '</View>'; 

       var billCyclesListId = "{c23bbae4-34f7-494c-8f67-acece3ba60da}";      
       spService.GetListItems(billCyclesListId, camlQuery, selectProperties) 
       .then(function(listItems) {     
        var listItemsWithValues = []; 

        if(listItems) { 
         var enumerator = listItems.getEnumerator(); 
         var promises = []; 
         while (enumerator.moveNext()) { 
          var listItem = enumerator.get_current(); 
          var listItemValues = [];         
          selectProperties 
          .forEach(function(propertyName) {        
           var value = listItem.get_item(propertyName); 
           if(propertyName === "PwC_JobCodesMulti"){ 
            jobvalue = ""; 
            value.forEach(function(jobvalues){ 
             jobvalue+= jobvalues.get_lookupValue() +";"; 
            }) 
            listItemValues[propertyName] = jobvalue; 
           }else{ 
            listItemValues[propertyName] = value; 
           } 
          }); 

          listItemsWithValues.push(listItemValues); 
         } 

         var promises = listItemsWithValues.map(addContentType); 
         Promise.all(promises).then(youCanUseTheData); 

         function youCanUseTheData(){ 
          /* 
          At this point, each listItem holds the 'Document Type' info 
          */ 
          listItemsWithValues.forEach(function(listItem) { 
           var fileDirRef = listItem["FileRef"]; 
           var id = listItem["ID"]; 
           var title = listItem["Title"]; 
           var serverUrl = _spPageContextInfo.webAbsoluteUrl.replace(_spPageContextInfo.webServerRelativeUrl,"");       
           var dispFormUrl = serverUrl + "/sites/billing/_layouts/15/DocSetHome.aspx?id="+fileDirRef; 
           //listItem["FileRef"] = dispFormUrl; 
           //listItem["Bill Cycle"] = dispFormUrl; 

           var parentLink = listItem["FileRef"]; 
           arrayofstrings = parentLink.split("/"); 
           var billCycleFolderName = arrayofstrings[arrayofstrings.length-2]; 
           arrayofstrings.pop(); 
           var hyperLink = '<a href="' + arrayofstrings.join('/') + '">' + billCycleFolderName + '</a>';       
           listItem["Bill Cycle"] = hyperLink; 

          }); 
         } 
        }     


        var enhancedListItemValues = spService.SpSearchQuery.EnhanceSearchResults(listItemsWithValues, enhanceFunctions);      
        deferred.resolve(listItemsWithValues); 
       }) 
       .catch (function (message) { 
        deferred.reject(); 
       }); 

       return deferred.promise; 
      } 

      function addContentType(listItem){ 
       var promise = getContentTypeOfCurrentItem(listItem.ID.toString()); 
       promise.then(function(cname){ 
        listItem['Document Type'] = cname; //we add the doc type to each listItem, not only the last one 
       }); 
       return promise; 
      } 

      function getContentTypeOfCurrentItem(id) {    
       var clientContext = new SP.ClientContext.get_current(); 
       var oList = clientContext.get_web().get_lists().getByTitle("Bill Cycles"); 
       listItem = oList.getItemById(id); 
       clientContext.load(listItem); 
       listContentTypes = oList.get_contentTypes(); 
       clientContext.load(listContentTypes); 
       clientContext.executeQueryAsync(
        function() { 
         $log.info("Successfully retrieved getContentTypeOfCurrentItemt"); 
         var ctid = listItem.get_item("ContentTypeId").toString();    
         var ct_enumerator = listContentTypes.getEnumerator(); 
         while (ct_enumerator.moveNext()) { 
          var ct = ct_enumerator.get_current();    
          if (ct.get_id().toString() == ctid) { 
           var contentTypeName = ct.get_name(); 
          } 
         } 
         return Promise.resolve(contentTypeName); 
        }, 
        function(error, errorInfo) { 
         $log.warn("Retrieving getContentTypeOfCurrentItem failed"); 
         deferred.reject(errorInfo); 
        } 
       ); 
      } 

不知道到底是什麼我失蹤

更新1:

我更改了代碼爲Niels回覆tere,但後來我得到以下錯誤:

Uncaught Error: The property or field has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested. 

如果我做分析的變化,即改變了方法的唯一事情就是返回新希望,其餘的是相同的,這是以前的工作。我沒有像尼爾斯那樣做所有的改變,只需要不費力氣就可以完成這項工作。 :)

function GetRelatedBillingDocumentsFromList(selectProperties, currentBillCyclePath, clientCode, jobCodes, engagementCode, enhanceFunctions) { 
       $log.info("Retrieving related billing documents for bill cycle with name [" + currentBillCyclePath + "]");     
       var deferred = $q.defer(); 
       var webUrl = _spPageContextInfo.webAbsoluteUrl; 
       var viewFields = spService.ConvertSelectPropertiesToViewFields(selectProperties); 
       // query must return the documents for the same client but in other bill cycles not the current one 
       var camlQuery = '<View Scope="RecursiveAll">' + viewFields + 
         '<Query>' + 
          '<Where>' + 
           '<And>' + 
            '<Eq>' + 
             '<FieldRef Name="ClientCode" />' + 
             '<Value Type="Text">'+ clientCode + '</Value>' + 
            '</Eq>' + 
            '<Neq>' + 
             '<FieldRef Name="ContentType" />' + 
             '<Value Type="Computed">Bill Cycle</Value>' + 
            '</Neq>' + 
           '</And>' + 
          '</Where>' + 
         '</Query>' + 
        '</View>'; 

       var billCyclesListId = "{c23bbae4-34f7-494c-8f67-acece3ba60da}";      
       spService.GetListItems(billCyclesListId, camlQuery, selectProperties) 
       .then(function(listItems) {     
        var listItemsWithValues = []; 

        if(listItems) { 
         var enumerator = listItems.getEnumerator(); 
         var promises = []; 
         while (enumerator.moveNext()) { 
          var listItem = enumerator.get_current(); 
          var listItemValues = [];         
          selectProperties 
          .forEach(function(propertyName) {        
           var value = listItem.get_item(propertyName); 
           if(propertyName === "PwC_JobCodesMulti"){ 
            jobvalue = ""; 
            value.forEach(function(jobvalues){ 
             jobvalue+= jobvalues.get_lookupValue() +";"; 
            }) 
            listItemValues[propertyName] = jobvalue; 
           }else{ 
            listItemValues[propertyName] = value; 
           } 
          }); 

          listItemsWithValues.push(listItemValues); 
         } 

         var promises = listItemsWithValues.map(addContentType); 
         Promise.all(promises).then(youCanUseTheData); 

         function youCanUseTheData(){ 
          /* 
          At this point, each listItem holds the 'Document Type' info 
          */ 
          listItemsWithValues.forEach(function(listItem) { 
           var fileDirRef = listItem["FileRef"]; 
           var id = listItem["ID"]; 
           var title = listItem["Title"]; 
           var serverUrl = _spPageContextInfo.webAbsoluteUrl.replace(_spPageContextInfo.webServerRelativeUrl,"");       
           var dispFormUrl = serverUrl + "/sites/billing/_layouts/15/DocSetHome.aspx?id="+fileDirRef; 
           //listItem["FileRef"] = dispFormUrl; 
           //listItem["Bill Cycle"] = dispFormUrl; 

           var parentLink = listItem["FileRef"]; 
           arrayofstrings = parentLink.split("/"); 
           var billCycleFolderName = arrayofstrings[arrayofstrings.length-2]; 
           arrayofstrings.pop(); 
           var hyperLink = '<a href="' + arrayofstrings.join('/') + '">' + billCycleFolderName + '</a>';       
           listItem["Bill Cycle"] = hyperLink; 

          }); 
         } 
        }     


        var enhancedListItemValues = spService.SpSearchQuery.EnhanceSearchResults(listItemsWithValues, enhanceFunctions);      
        deferred.resolve(listItemsWithValues); 
       }) 
       .catch (function (message) { 
        deferred.reject(); 
       }); 

       return deferred.promise; 
      } 

      function addContentType(listItem){ 
       return getContentTypeOfCurrentItem(listItem.ID.toString()).then(function(cname){ 
        listItem['Document Type'] = cname; //we add the doc type to each listItem, not only the last one 
       }); 
      } 

      function getContentTypeOfCurrentItem(id) { 
       return new Promise(function (resolve, reject) { 
        var clientContext = new SP.ClientContext.get_current(); 
        var oList = clientContext.get_web().get_lists().getByTitle("Bill Cycles"); 
        listItem = oList.getItemById(id); 
        clientContext.load(listItem); 
        listContentTypes = oList.get_contentTypes(); 
        clientContext.load(listContentTypes); 
        clientContext.executeQueryAsync(
         function() { 
          $log.info("Successfully retrieved getContentTypeOfCurrentItemt"); 
          var ctid = listItem.get_item("ContentTypeId").toString();    
          var ct_enumerator = listContentTypes.getEnumerator(); 
          while (ct_enumerator.moveNext()) { 
           var ct = ct_enumerator.get_current();    
           if (ct.get_id().toString() == ctid) { 
            var contentTypeName = ct.get_name(); 
           } 
          } 
          resolve(contentTypeName); 
         }, 
         function(error, errorInfo) { 
          $log.warn("Retrieving getContentTypeOfCurrentItem failed"); 
          reject(errorInfo); 
         } 
        ); 
       }); 
      } 
+2

的'getContentTypeOfCurrentItem'函數不返回任何 – user184994

+0

@ luis https://stackoverflow.com/a/42577762/713789 – Adrian

回答

1

getContentTypeOfCurrentItem應返回的承諾。假設clientContext.executeQueryAsync不返回一個承諾,因爲它使用的處理程序:

function getContentTypeOfCurrentItem(id) { 
    return new Promise(function (resolve, reject) { 
     var clientContext = new SP.ClientContext.get_current(); 
     var oList = clientContext.get_web().get_lists().getByTitle("Bill 
Cycles"); 
     listItem = oList.getItemById(id); 
     clientContext.load(listItem); 
     listContentTypes = oList.get_contentTypes(); 
     clientContext.load(listContentTypes); 
     clientContext.executeQueryAsync(
      function() { 
       $log.info("Successfully retrieved 
getContentTypeOfCurrentItemt"); 
       var ctid = listItem.get_item("ContentTypeId").toString();    
       var ct_enumerator = listContentTypes.getEnumerator(); 
       while (ct_enumerator.moveNext()) { 
        var ct = ct_enumerator.get_current();    
        if (ct.get_id().toString() == ctid) { 
         var contentTypeName = ct.get_name(); 
        } 
       } 
       resolve(contentTypeName); 
      }, 
      function(error, errorInfo) { 
       $log.warn("Retrieving getContentTypeOfCurrentItem failed"); 
       reject(errorInfo); 
      } 
     ); 
    }); 
} 

addContentType可以更容易,以及:

function addContentType(listItem){ 
    return getContentTypeOfCurrentItem(listItem.ID.toString()).then(function(cname) { 
     listItem['Document Type'] = cname; //we add the doc type to each listItem, not only the last one 
    }).catch(function(error) { 
     $log.warn("Server error"); 
    }); 
} 
+0

請看我的更新,因爲我得到這個錯誤 –

+0

@LuisValencia看起來你是一個進步。這似乎是一個服務器錯誤。我在addContentType部分添加了一個catch。您還可以通過Fiddler或瀏覽器(Chrome)檢查器來檢查服務器回覆。 –

1

getContentTypeOfCurrentItem函數不返回任何內容。只是修改它來回報您的承諾(當然,假設clientContext.executeQueryAsync返回一個承諾):

function getContentTypeOfCurrentItem(id) { 
    var clientContext = new SP.ClientContext.get_current(); 
    var oList = clientContext.get_web().get_lists().getByTitle("Bill Cycles"); 
    listItem = oList.getItemById(id); 
    clientContext.load(listItem); 
    listContentTypes = oList.get_contentTypes(); 
    clientContext.load(listContentTypes); 
    return clientContext.executeQueryAsync(
    function() { 
     $log.info("Successfully retrieved getContentTypeOfCurrentItemt"); 
     var ctid = listItem.get_item("ContentTypeId").toString(); 
     var ct_enumerator = listContentTypes.getEnumerator(); 
     while (ct_enumerator.moveNext()) { 
     var ct = ct_enumerator.get_current(); 
     if (ct.get_id().toString() == ctid) { 
      var contentTypeName = ct.get_name(); 
     } 
     } 
     return Promise.resolve(contentTypeName); 
    }, 
    function(error, errorInfo) { 
     $log.warn("Retrieving getContentTypeOfCurrentItem failed"); 
     deferred.reject(errorInfo); 
    } 
); 
}