Пропуск параметров в функции обратного вызова - PullRequest
17 голосов
/ 27 марта 2012

Функция обратного вызова, с которой я работаю, имеет следующую подпись (от http://api.jquery.com/load/):

complete(responseText, textStatus, XMLHttpRequest)

Теперь мне нужен только третий параметр. В Lua есть соглашение, в котором подчеркивание используется для пропуска ненужных возвращаемых значений из функций ( пропуск , потому что _ фактически будет содержать значение):

var1, _, _, var4 = func()

Поэтому я подумал о том, чтобы сделать то же самое с JavaScript, и установил сигнатуру своей функции следующим образом:

function (_, _, XMLHttpRequest)

Что-то не так с этим подходом, возможно, есть лучший / чище способ?

Ответы [ 3 ]

13 голосов
/ 27 марта 2012

Техника не красивая, но я сам использую ее несколько раз.Я думаю, что все же было бы гораздо лучше дать этим неиспользуемым аргументам осмысленные имена (просто, чтобы избежать путаницы), но вы хорошо используете подчеркивания.

Я часто вижу, что он используется в обратных вызовах, связанных с jQuery, где index часто передается в качестве первого аргумента, например

$('.foo').each(function(_, node) {
});

, потому что большую часть времени вас не волнует индекс там.Таким образом, чтобы ответить на ваш реальный вопрос, нет ничего плохого в использовании этой техники (возможно, кроме путаницы), и нет лучшего / более чистого способа пропустить нежелательные аргументы.

2 голосов
/ 27 марта 2012

Вы используете два аргумента с одинаковыми именами.Вы должны написать так:

function (_, __, myXhr)
1 голос
/ 14 июля 2019

Я признаю, что использование _ является распространенным шаблоном для пропуска параметров, предшествующих желаемому. Это круто для одного параметра, может быть 2.

somethingWithACallback((_, whatIAmLookingFor) => { 
  // ...
})

но я застрял, нуждаясь в пятом. Это будет означать, что мне придется написать

somethingWithACallback((_, __, ___, ____, whatIAmLookingFor) => { 
  // ...
})

Для этого случая я предлагаю этот шаблон:

somethingWithACallback((...args) => { 
  const whatIAmLookingFor = args[4];
})

С помощью деструктурирования вы также можете сделать это

somethingWithACallback((...args) => { 
  const [,,,,whatIAmLookingFor] = args;
})

и применить это к нескольким параметрам

somethingWithACallback((...args) => { 
  const [,,,,whatIAmLookingFor,,andAnotherThing] = args;
})

и тем самым по сути выбирайте то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...