как написать setTimeout с параметрами по Coffeescript


208

Пожалуйста, скажите мне, как написать javascript ниже в coffeescript.

setTimeout(function(){
    something(param);
}, 1000);

как мы можем добавить .call ('привет') к этому
Atul

Ответы:


214

Я думаю, что это полезное соглашение для обратных вызовов в качестве последнего аргумента функции. Например, это обычно относится к API Node.js. Итак, имея в виду:

delay = (ms, func) -> setTimeout func, ms

delay 1000, -> something param

Конечно, это добавляет накладные расходы на дополнительный вызов функции для каждого, что setTimeoutвы делаете; но в современных интерпретаторах JS недостаток производительности незначителен, если вы не делаете это тысячи раз в секунду. (И вообще, что вы делаете, устанавливая тысячи тайм-аутов в секунду?)

Конечно, более простой подход состоит в том, чтобы просто назвать ваш обратный вызов, который в любом случае имеет тенденцию создавать более читаемый код (jashkenas - большой поклонник этой идиомы):

callback = -> something param
setTimeout callback, 1000

Отлично, если вам не нужны вложенные обратные вызовы
Стивен Прибилинский

184
setTimeout ( ->
  something param
), 1000

Скобки не обязательны, но начинка с запятой казалась мне грязной.


Выньте паренсы и выпейте чашку кофе, ~)
Билли Мун

4
Не компилируется со скобками для меня. Я должен был удалить их, начать строку с запятой, и это работает как шарм.
Джереми Тилле

С помощью скобок вы также можете сделать это в одной строке.

1
@JeremyThille обратите внимание, что промежуток между setTimeoutоткрывающим пареном важен. Пробел там означает, что круглые скобки окружают замыкание как первый параметр setTimeout; если бы это было непосредственно после t, то coffescript ожидал бы, что скобки заключают оба параметра.
Янки

67
setTimeout -> 
  something param
, 1000

Это лучше, если вы просто хотите использовать анонимную функцию.
Алекс К

также для именованной функции setTimeout namedFunc, 5000
Dirk Smaverson

Обратите внимание, что пробелы важны. Вызов должен быть расположен точно так же, как указано выше. Если something paramнаходится на той же строке, что setTimeoutи он анализируется по-разному.
henrebotha

46

Это приведет к примерно эквивалентному переводу (спасибо @Joel Mueller):

setTimeout (-> something param), 1000

Обратите внимание, что это не точный перевод, потому что анонимная функция возвращает результат вызова something(param)вместо undefined, как в вашем фрагменте.


1
Слишком много паренов / точек с запятой! Это CoffeeScript, избавление от лишних паренов - половина дела. setTimeout (() -> something param), 1000
Джоэл Мюллер

Николай подчеркивает, что пустые паренсы тоже необязательны.
Джоэл Мюллер


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.