无法在承诺中读取未定义的属性'then'

问题描述 投票:0回答:2

我在这个方法上有以上错误:

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.

如果我分析完成的更改,那么该方法唯一改变的是返回新的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){
                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);
                       }
                    );
                });
            }
javascript promise
2个回答
1
投票

getContentTypeOfCurrentItem应该返回一个Promise。假设clientContext.executeQueryAsync不返回promise,因为它使用处理程序:

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

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);
    }
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.