首页 > 解决方案 > 数组长度未报告

问题描述

这应该很简单,但对我来说没有意义。它是 Promise 链的一个简单部分

let flightName = [];
let guidArr = [];

Promise.all(guidArr)
       .then(values => {
         for(var a = 0; a < values.length; a++) {
           Xrm.WebApi
              .online
              .retrieveRecord("crd80_flightplanevent", values[a], "?$select=_crd80_learnerflight_value")
              .then(
                function success(result) {
                  flightName.push(result["_crd80_learnerflight_value@OData.Community.Display.V1.FormattedValue"])
                },
                function(error) {
                  DisplayError(error)
                }); 
         }
         return flightName
       }).then(flightName => {
         console.log(flightName) 
         console.log(flightName.length)         
         return flightName
       })

控制台日志

控制台正确显示了 flightName 数组,但 flightName.length 始终被控制台为 0,即使 console.log(flightName) 将 length:2 作为输出

为什么???我需要处理数组中的每个项目,但无法正确识别

标签: javascriptarrays

解决方案


@derpircher建议奏效了:

您不是在等待for(var a = 0; a < values.length; a++)循环中的承诺。因此,当您这样做时return flightName,数组仍然是空的,因此会console.log(flightName.length)打印0. 的输出console.log(flightName)可能会假装flightName包含值,但实际上它并不包含值,因为它console.log引用了对象,该对象稍后在 promise 解决时被填充。这样做console.log(JSON.stringify(flightName)),你会看到它打印出来只是[]因为在那一刻,数组仍然是空的

要解决该问题,请制作第一个then处理程序async并使用await Xrm.WebApi...或正确地将整个东西包装在一个Promise.all


推荐阅读