0

我有一个对象,它将字符串ids映射到对象。idproduct

for id of ids
  product = ids[id]
  console.log product # Prints out something different each loop. :)
  Product.create(product).then ->
    console.log product # Only prints out the last id each loop. :(

我正在使用一个用于数据库交互的库,它公开了 Promise(由then上面的函数表示)。我试图打印出函数product内的变量then,但我似乎只得到了最后一个idids所以看起来这是一个范围问题。如何正确确定变量的范围,以便在每个循环product的函数中打印出不同的产品?then

4

2 回答 2

2

Bergi 的代码误导了 IMO,因为它一次运行整个循环,而不是按顺序运行。出于这个原因,我只需要提升所有代码以在 Promise 中工作,而不是混合同步和异步:

Promise.resolve(product for _, product of ids).then next = (products) ->
  [product, products...] = products
  if product
    console.log product
    Product.create(product).then ->
      console.log product
      next products
.then ->
  console.log "all done"

区别在于:

  • 就像在真正的循环中一样,下一个项目在前一个项目完成之前不会运行
  • 就像在真正的循环中一样,下一行(只需要then ->在循环完全完成后运行

真正循环的这些属性比你可以在几天内学习的表面语法重要得多。

让它运行并查看日志中的差异。

于 2014-06-04T08:23:00.467 回答
2

@false 确实找到了描述您的问题的正确副本。实际上,您遇到了一个范围问题,product即循环体不是本地的,并且您只能从异步回调中获取最后一项。

如何正确确定产品变量的范围,以便它在 then 回调中打印出不同的产品?

在惯用的 coffeescript 中,您将在循环中使用 IEFE 的do表示法

for id of ids
  do (product = ids[id]) ->
    console.log product
    Product.create(product).then ->
      console.log product

或者,直接从of-loop 中绘制属性值:

for id, product of ids
  do (product) ->
    …
于 2014-06-04T03:57:49.857 回答