【问题标题】:Can't get iced-coffee-script with comprehensions such as map or reduce无法通过 map 或 reduce 等理解获得 iced-coffee-script
【发布时间】:2013-01-15 14:32:26
【问题描述】:

所有,我今天发现了 iced-coffee-script 并且很高兴看到有人尝试为异步编程设计一种更具可读性的咖啡脚本方言。

尽管使用 map 和 reduce 函数之类的推导,或者更简单的 do/for,但我无法工作。例如。的输出...

square = (x, callback) ->
  setTimeout ->
      callback x * x
    , 5000

console.log [ 1..10 ].map (x) ->
  await square x, defer y
  y  

... 只是一个未定义的数组!我错过了什么?提前谢谢你。

贾塞科

【问题讨论】:

    标签: iced-coffeescript


    【解决方案1】:

    我刚接触 iced,但这是我的理解:

    使用 await 和 defer 实际上并不会停止控制流,您的函数将照常返回。所以 .map 会为每个元素返回“未定义”。

    这是串行版本,如上:

    foo = []
    for x in [ 1..10 ]
      await square x, defer y
      foo.push y
    

    如果要并行做,是这样的:

    foo = []
    await
      for x,i in ([ 1..10 ])
        square x, defer foo[i]
    

    请注意,我将 [1..10] 范围括在括号中。这是为了将范围扩展到一个数组,所以我们可以在循环中获取索引,这里解释:https://github.com/jashkenas/coffee-script/issues/2586

    .push 在这里不起作用,因为回调通常不能保证按您想要的顺序返回。

    还有很多其他方法可以做到这一点,但我认为这是完成您在上面尝试做的最简洁的方法。请注意,如果它是一个大循环,它将首先分配整个数组,这可能是低效的。

    【讨论】:

      【解决方案2】:

      我会将我的 2 美分添加到 @doubledriscoll 的答案中,以便您更好地了解这里实际发生的情况。让我们将您的代码示例翻译成常规的 javascript,所以这段代码:

      console.log [ 1..10 ].map (x) ->
        await square x, defer y
        y  
      

      相当于:

      console.log([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(x) {
        return square(x, function(y) {
          return y;
        });
      });
      

      这将打印square函数返回的数组,即undefined

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2017-05-06
        • 1970-01-01
        • 2011-08-29
        相关资源
        最近更新 更多