【问题标题】:use promise in array items inside a Map object在 Map 对象内的数组项中使用 promise
【发布时间】:2022-01-12 17:41:59
【问题描述】:

我需要遍历一个 Map 对象 - 使其真实 - 可以说它是一个 多边形集合(多边形由坐标集合表示 - 纬度和经度)。 地图中的每个项目都有一个项目集合(坐标)。 对于地图(多边形)中的每个项目(坐标),我需要执行一些返回 Promise 的异步操作。在完成承诺(返回一个字符串)集合之后 - 我想将它推入一个带有前面单词“POLYGON ...”的数组中。 随着所有这一切的结束(在地图上的迭代) - 我有一个“多边形”数组及其坐标。 然后我想用这个数组做点什么。 问题是 Map 迭代结束时没有考虑其中的承诺,这意味着 - 当迭代完成时,应该由迭代中的承诺填充的数组是未定义的。 查看我的代码:

//Polygons is the Map object
let polygonsarray : [] = []
let strPolygonArray : string;
for (let [key, value] of this.Polygons.items.entries())
{
    if (value.PolygonItem)
    {
        Promise.all(value.PolygonItem.map(p =>
        {
            return someAsychActionThatReturnPromise(p).then(res => res)
        })).then(data =>
        {
            polygonsarray.push("POLYGON(" + data + ")"));
            
        }).catch(err => return throwError(err));
    }
}

//polygonsarray is still empty in this stage
strPolygonArray = polygonsarray.join();

【问题讨论】:

  • How do I ask a good question?: "描述问题。“它不起作用”的描述不足以帮助人们理解你的问题。相反,告诉其他人读者预期的行为应该是什么。告诉其他读者错误消息的确切措辞是什么,以及产生它的代码行。"
  • @Andreas - 抱歉 - 类型错误 - 我的意思是多边形数组。我修好了。
  • polygonsarray 不是undefined。您在该变量中存储一个空数组。它“只”是空的。
  • 您不是在等待Promise.all().then 承诺得到解决。您只需将打印作为同步执行代码的一部分。

标签: angular typescript asynchronous promise rxjs


【解决方案1】:

您不是在等待Promise.all().then() 承诺得到解决。您只需将打印作为同步执行代码的一部分。

其他一些评论:

  • .then(res => res) 没有实用性,它只是将一个承诺复制到另一个具有相同分辨率的承诺中。

  • err => return throwError(err) 不是有效的 JavaScript。您可以将throwError 作为catch 回调参数的函数引用传递。

  • 不要将元素异步推送到数组中,只需返回要推送的值(这将是承诺的值),并在 Promise.all 解析后,一次性将该数据收集到您的数组中。

  • 使用asyncawait语法:提高代码的可读性。

  • 当您不使用key 部分时,您无需调用entries()。在这种情况下,只需使用values()

这是它的外观(我排除了错误处理):

async collectPolygons() {
    let polygonsarray : [] = await Promise.all(
        Array.from(this.Polygons.items.values(), async ({PolygonItem}) => {
            if (!PolygonItem) return ""; // This will be filtered out later
            let data = await Promise.all(PolygonItem.map(someAsychActionThatReturnPromise));
            return "POLYGON(" + data.join(",") + ")");
        }) 
    );
    
    let strPolygonArray : string = polygonsarray.filter(Boolean).join(",");
    // ...
}

看到您使用this,我想代码出现在类的某个方法中,所以如果这是您的上下文,请在方法名称前添加async。如果这是一个独立的函数,你还需要添加function关键字。

注意strPolygonArray 只会被异步分配一个值,所以如果你想返回它,调用者仍然必须使用异步模式来获取实际值(使用awaitthen)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2020-07-11
    • 2019-01-22
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    相关资源
    最近更新 更多