Не могу получить сценарий со льдом-кофе с такими понятиями, как карта или сокращение

В общем, сегодня я обнаружил сценарий со льдом-кофе и был очень рад видеть, что кто-то пытался создать более читаемый диалект сценария для кофе для асинхронного программирования.

Я не могу замёрзнуть в работе, хотя с такими понятиями, как карта и функции сокращения, или с более простым делом / для. Например, вывод...

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

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

... это просто массив неопределенных! Что мне не хватает? Заранее спасибо.

Giacecco

2 ответа

Я новичок в ледяной, но вот мое понимание:

Использование await и defer фактически не останавливает поток управления, ваша функция вернется как обычно. Таким образом.map получает "undefined", возвращаемый для каждого элемента.

Вот серийная версия, как указано выше:

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 цента к ответу @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,

Другие вопросы по тегам