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

208

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

setTimeout(function(){
    something(param);
}, 1000);
tomodian
источник
как мы можем добавить .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, как в вашем фрагменте.

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

Я считаю, что это лучший способ сделать то же самое,

setTimeout (-> alert "hi"), 1000
Махеш Кулькарни
источник
3

другой вариант:

setTimeout(
    -> something param
    1000
)
Рон
источник