如何将第二个Promise的值添加到值数组中

路易·瓦伦西亚

我不确定问题的标题是否有意义,但可能与代码有关,它将帮助我解释一下。

我有以下代码,但默认情况下,列表项值中未返回sharepoint内容类型。

function getListItems(listId, camlQueryString, selectProperties){  
    var deferred = $q.defer();
    var context = SP.ClientContext.get_current();
    var web = context.get_web();

    var list = web.get_lists().getById(listId);

    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(camlQueryString);

    var listItems = list.getItems(camlQuery);

    //var includesString = "Include(ID,Title,AssignedTo, WorkflowOutcome, ApproverComments, FileRef, WorkflowItemId, Created, Modified)"; // + selectProperties.join(", ") +  ")";
    if(selectProperties) {
        var includesString = convertSelectPropertiesToIncludesString(selectProperties);
        context.load(listItems, includesString);
    } else {
        context.load(listItems);
    }
    context.executeQueryAsync(
        function() {
            $log.info("Successfully retrieved list item result");

            deferred.resolve(listItems);
        },
        function(error, errorInfo) {
            $log.warn("Retrieving list item result failed");

            deferred.reject(errorInfo);
        }
    );
    return deferred.promise;
}

我正在尝试转换此方法以在相同的值数组中获取内容类型名称

function getListItemswithContentType(listId, camlQueryString, selectProperties){  
    var deferred = $q.defer();
    var context = SP.ClientContext.get_current();
    var web = context.get_web();

    var list = web.get_lists().getById(listId);

    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(camlQueryString);

    var listItems = list.getItems(camlQuery);

    //var includesString = "Include(ID,Title,AssignedTo, WorkflowOutcome, ApproverComments, FileRef, WorkflowItemId, Created, Modified)"; // + selectProperties.join(", ") +  ")";
    if(selectProperties) {
        var includesString = convertSelectPropertiesToIncludesString(selectProperties);
        context.load(listItems, includesString);
    } else {
        context.load(listItems);
    }

    context.executeQueryAsync(Function.createDelegate(this, SuccessHandler),Function.createDelegate(this, ErrorHandler));

    return deferred.promise;
}

function SuccessHandler(result) {
    listItemEnumerator = listItems.getEnumerator();
    while (listItemEnumerator.moveNext()) {
        oListItem = listItemEnumerator.get_current();
        var CT = oListItem.get_contentType();
        context.load(CT);
        context.executeQueryAsync(
            (function (contentobject) {
                return function () {
                    var value = contentobject.get_name();
                    alert("VAL: "+value);
                };
            }(contentobject)),
            function () {
                alert("No Success");
            }
        );
    }               
}

function ErrorHandler(sender, args) {
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}

但是,如您所见,这里有2个异步执行,在成功处理程序方法中,我返回了内容类型名称,但是我不知道如何将该内容类型名称作为值添加到listitems数组中。

更新1

来电方式

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>' +   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>' +
                            //'<QueryOptions>' +
                            //  '<ViewAttributes Scope="RecursiveAll" />' +
                            //'</QueryOptions>' +
                        '</Query>' +
                    '</View>';

                var billCyclesListId = "{c23bbae4-34f7-494c-8f67-acece3ba60da}";                    
                spService.GetListItemswithContentType(billCyclesListId, camlQuery, selectProperties)
                .then(function(listItems) {
                    var listItemsWithValues = [];
                    if(listItems) {
                        var enumerator = listItems.getEnumerator();
                        while (enumerator.moveNext()) {
                            var listItem = enumerator.get_current();
                            var listItemValues = [];                                
                            selectProperties
                            .forEach(function(propertyName) {                               
                                var value = listItem.get_item(propertyName);
                                listItemValues[propertyName] = value;
                            });

                            listItemsWithValues.push(listItemValues);
                        }
                    }

                    // Create the full item url
                    listItemsWithValues.forEach(function(listItem) {
                        var fileDirRef = listItem["FileRef"];
                        var id = listItem["ID"];
                        var serverUrl = _spPageContextInfo.webAbsoluteUrl.replace(_spPageContextInfo.webServerRelativeUrl,"");                          
                        var dispFormUrl = serverUrl + fileDirRef + "/DispForm.aspx?ID=" + id;
                        listItem["FileRef"] = dispFormUrl;
                    });

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

                return deferred.promise;
            }
HMR

也许以下方法会起作用,如果您使用的是旧版JavaScript引擎,则可能需要研究如何polyfilPromise.allnew Promise如果箭头功能不起作用,则可以替换e => zfunction(e){return z;}

function SuccessHandler(result) {
  listItemEnumerator = listItems.getEnumerator();
  const promises = [];
  while (listItemEnumerator.moveNext()) {
    oListItem = listItemEnumerator.get_current();
    var CT = oListItem.get_contentType();
    context.load(CT);
    promises.push(
      new Promise(
        (resolve,reject) =>
          context.executeQueryAsync(
            //if contentobject is shared mutable object you're in trouble
            //  that doesn't work with concurrently running code that depends on it
            //  if it's mutable then prividing it in a closure with the IIFE isn't going
            //  to save you either
            (function (contentobject) {
              return function () {
                var value = contentobject.get_name();
                console.log("VAL: " , value);
                //not sure what it is you want to return here
                return [value,result];
              };
            }(contentobject)),
            function () {
              console.log("No Success");
            }
          )
      )
    );
    return Promise.all(promises)
    .then(
      results => {
        results.forEach(
          //just log all the results, you can remove the then
          //  if this was what you need
          ([value,result]) => console.log("value:",value,"result",result)
        );
        return result;
      }
    )
  }
}

如果调用的函数getListItemswithContentType需要知道何时完成,则可以返回一个Promise。

return new Promise(
  (resolve,reject) =>
    context.executeQueryAsync(
      x=>SuccessHandler(x).then(resolve,reject)
      ,error=>reject(error)
    )
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将两个数组列表中的值相乘,然后将其添加到第二个数组列表中?

在 R 中,如何将 1 个向量中的每个值添加到第二个向量中的每个值?

如何将第二个值添加到同一个循环?

如何将第一个字典中的值添加到第二个字典中的值

如何将第二个View Controller也添加到ContainerView中?

删除数组中的重复项,并将其第二个值添加到数组中

如何将第二个变量添加到简单的javascript函数?

如何将第二个模态添加到我的HTML页面

如何将 Qvideowidget 添加到第二个主窗口

JavaScript:无法将第二个值添加到单链表

熊猫根据第二个df中的值将列添加到df中

如何将数据从一个表添加到第二个表中,但仅在匹配的行中添加

对于数组中的每个元素,将字符串添加到第二个数组中

Prolog,如何将项目从一个列表添加到第二个

将值从第一个选择添加到第二个选择

Python如何将列表中的第二个值转换为int

将第二个 Invoke-WebRequest 导入中的数据添加到现有数组中

为什么不能将第二个EditText字段中的值添加到数据库中?

将x添加到所有嵌套数组中的第二个元素的更快方法

将两个表中的信息添加到第二个表

如何将第二个数据源添加到 Windows 窗体中的现有 DataGridView

将列表中的行添加到第二个列表Powershell中的行

如何将一个 df 中的值附加到一个表达式中的第二个列的底部?

将第二个项目添加到模块中

使用PHP将第二个变量添加到SQL查询中

如果没有第二个连接到第一个连接,如何将第一个连接的过滤器列表中的值添加到第一个连接的结果,添加行值?

如何在不添加到第一个表的情况下将表行添加到第二个表中

如何将数组的值作为第二个参数传递给 awk 的 split 函数?

检查一个 arraylist 中的相同值,并将数量添加到 android 中第二个 arraylist 中的相应值