【问题标题】:coffeescript promise recursion chain issue咖啡脚本承诺递归链问题
【发布时间】:2021-11-21 08:28:49
【问题描述】:

我的初始数据是这样的

[{"id":1,"type":"value","pid":"123"},
 {"id":2,"type":"value1","pid":"451"},
 {"id":3,"type":"value3","pid":"132"}
]

现在基于type==value1,我将递归调用一个函数,该函数将为该元素pid 提供subset_data 并继续这样。

最终数据会是这样的

[    
    {"1":{"type":"value","pid":"123"}}, ## transformed id as root key  
    {"2":{"type":"value1","pid":"451", ## make recursive function call and populate some subset_data for `pid=451`
          "subset_data":[
              {"4":{"type":"value","pid":"1234"},
              {"5":{"type":"value1","pid":"321",## make recursive function call and populate some subset_data for `pid=321`
                "subset_data":[
                  {...},
                  {...}
                 ]
               }
              },
              {"6":{"type":"value2","pid":"111"}
            ]
         }
     },
        
    {"3":{"type":"value3","pid":"132"}}
   ]

我已经尝试了几个功能

get_datas = (id) ->
     get_data(id)
        .map (data) ->
            if data.type == "value1"
              get_datas(_.get(data,"pid"))
                .then (subdatas) ->
                  return _.set(
                    {},
                    [data.id, 'subset_data'],
                    subdatas
                  )
            _.zipObject([data.id], [ _.omit(data, 'id')])

这只给出了这个

[  
    {"1":{"type":"value","pid":"123"},
    {"2":{"type":"value1","pid":"451"},
    {"3":{"type":"value3","pid":"132"}}
   ]

无法将 subdatas 添加到 data 。不知道如何将它们嵌入到回报中。

我尝试的另一种测试方式

get_datas = (id) ->
     get_data(id)
        .map (data) ->
            if data.type == "value1"
              return get_datas(_.get(data,"pid"))                     
            _.zipObject([data.id], [ _.omit(data, 'id')])

这给出了所有嵌套数据,但没有键(预期),如下所示

[
  [
    [
     {}
     {}
     {}
    ]
   {}
   {}
  ]
 {}
 {}
]

【问题讨论】:

  • -> 不是 JavaScript。
  • 所需的输出数据结构不清楚。
  • 我的错我应该提到coffeescript
  • 你没有返回,在第二个变体中,你返回的只是函数而不是值。
  • @Yaroslav 不确定我是否关注了你 return get_datas(_.get(data,"pid")) 这将返回 subset_data 元素列表 [{},{},{}] 。我试过return _.set( {},[data.id,"subset_data"], get_datas(_.get(data,"pid")) ) ,但这给了承诺问题{ "isFulfilled": false, "isRejected": false }

标签: promise coffeescript


【解决方案1】:

您可以通过以下方式创建所需的结构以进行同步数据检索。

get_datas = (id) ->
  get_data(id).map ({ id, data... }) -> 
    data.subset_data = get_datas(data.pid) if data.type == 'value1'
    { [id]: data }

我添加了这个,因为在您的问题中,get_data 看起来是一个同步函数,在这种情况下,get_datas 不需要异步。

如果get_data 确实是异步的,那么get_datas 也将因此是异步的。这使得上面的内容稍微复杂一些,但总体上没有太大变化。

get_datas = (id) ->
  Promise.all (await get_data(id)).map ({ id, data... }) ->
    data.subset_data = await get_datas(data.pid) if data.type == 'value1'
    { [id]: data }

请注意,data.subset_data = 不会改变原始数组元素,因为data... 正在将所有剩余属性收集到一个新对象中。由于第二个变体是异步的,您还应该确保await 结果。

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2011-12-18
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多