Не могу получить сценарий со льдом-кофе с такими понятиями, как карта или сокращение
В общем, сегодня я обнаружил сценарий со льдом-кофе и был очень рад видеть, что кто-то пытался создать более читаемый диалект сценария для кофе для асинхронного программирования.
Я не могу замёрзнуть в работе, хотя с такими понятиями, как карта и функции сокращения, или с более простым делом / для. Например, вывод...
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
,