как написать 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.