Есть ли способ передать больше данных в функцию обратного вызова в jQuery?
У меня есть две функции, и я хочу, чтобы обратный вызов $.post
, например, передавал как результирующие данные вызова AJAX, так и несколько пользовательских аргументов
function clicked() {
var myDiv = $("#my-div");
// ERROR: Says data not defined
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
// ERROR: Would pass in myDiv as curData (wrong)
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
}
function doSomething(curData, curDiv) {
}
Я хочу иметь возможность передавать свои собственные параметры обратному вызову, а также результат, возвращаемый вызовом AJAX.
Ответы:
Решением является привязка переменных через замыкание.
В качестве более простого примера, вот пример функции, которая получает и вызывает функцию обратного вызова, а также пример функции обратного вызова:
Это вызывает обратный вызов и предоставляет один аргумент. Теперь вы хотите предоставить дополнительный аргумент, чтобы обернуть обратный вызов в замыкание.
Или, проще, используя функции стрелки ES6 :
Что касается вашего конкретного примера, я не использовал
.post
функцию в jQuery, но быстрое сканирование документации показывает, что обратный вызов должен быть указателем на функцию со следующей сигнатурой:Поэтому я думаю, что решение заключается в следующем:
Что происходит?
В последней строке,
doSomething(extraStuff)
будет вызван и результатом этого вызова является указателем на функцию .Потому
extraStuff
что передается в качестве аргумента,doSomething
это входит в область действияdoSomething
функции.Когда
extraStuff
ссылка указана в возвращенной анонимной внутренней функции,doSomething
она связана закрытием сextraStuff
аргументом внешней функции . Это верно даже после того,doSomething
как вернулся.Я не проверял выше, но я написал очень похожий код за последние 24 часа, и он работает так, как я описал.
Конечно, вы можете передать несколько переменных вместо одного объекта extraStuff в зависимости от ваших личных предпочтений / стандартов кодирования.
источник
При использовании
doSomething(data, myDiv)
вы фактически вызываете функцию и не ссылаетесь на нее.Вы можете либо передать
doStomething
функцию напрямую, но вы должны убедиться, что она имеет правильную подпись.Если вы хотите сохранить doSomething таким, какой он есть, вы можете обернуть его вызов в анонимную функцию.
Внутри кода анонимной функции вы можете использовать переменные, определенные в области видимости. Это способ работы Javascript.
источник
return function(...){...}
функций внутриdoSomething
функции. Я нашел еще один четкий пример того же понятия: theelitist.net/…(function(myDiv){ ... })(myDiv)
для захвата переменнойmyDiv
. Это неявно сделано в ответе @bradhouse.На самом деле это проще, чем у всех, когда это звучит ... особенно если вы используете
$.ajax({})
базовый синтаксис против одной из вспомогательных функций.Просто передайте
key: value
пару, как вы бы делали для любого объекта, когда вы настраиваете свой ajax-запрос ... (поскольку$(this)
контекст еще не изменился, он все еще является триггером для вызова bind выше)Одна из причин, по которой это лучше, чем установка переменной, заключается в том, что переменная является глобальной и, следовательно, перезаписываемой ... если у вас есть две вещи, которые могут инициировать вызовы ajax, теоретически вы можете запускать их быстрее, чем отвечает вызов ajax, и у вас будет значение для второго вызова, переданного в первый. При использовании вышеописанного метода этого не произойдет (и его тоже довольно просто использовать).
источник
closure
мне просто нужно, чтобы это работало, и это абсолютно туз, чисто, просто и не глобально.В сегодняшнем мире есть другой ответ, который чище и взят из другого ответа переполнения стека:
Вот оригинальный вопрос и ответ: JQuery КАК? передать дополнительные параметры для успешного обратного вызова для вызова $ .ajax?
источник
Вы также можете попробовать что-то вроде следующего:
источник
Вы можете использовать закрытие JavaScript:
и когда вы можете сделать:
источник
Я сделал ошибку в последнем моем посте. Это рабочий пример того, как передать дополнительный аргумент в функцию обратного вызова:
источник
Пойдем просто! :)
источник
Более общее решение для отправки асинхронных запросов с использованием
.ajax()
jQuery API и замыканий для передачи дополнительных параметров в функцию обратного вызова:источник
Для меня и других новичков, которые только что связались с Javascript,
я думаю, что
Closeure Solution
это немного запутанно.В то время как я обнаружил, что вы можете легко передать столько параметров, сколько захотите, для каждого обратного вызова ajax с помощью jquery
Вот два более простых решения .
Первый, о котором @zeroasterisk упомянул выше, пример:
Во-вторых, передайте самоопределенные данные, добавив их в тот,
XHR object
который существует в течение всего срока службы ajax-request-response.Как вы можете видеть, у этих двух решений есть недостаток: вам нужно писать немного больше кода каждый раз, чем просто писать:
Узнайте больше о $ .ajax: http://api.jquery.com/jquery.ajax/
источник
Если кто-то все еще приходит сюда, это мое мнение:
Что происходит здесь, после привязки к функции обратного вызова, она будет доступна в функции как
this
.Эта идея проистекает из того, как React использует
bind
функциональность.источник
Вторичный способ:
источник
на самом деле, ваш код не работает, потому что когда вы пишете:
Вы помещаете вызов функции в качестве третьего параметра, а не ссылки на функцию .
источник
Как дополнение к ответу b01 , второй аргумент
$.proxy
часто используется для сохраненияthis
ссылки. Дополнительные переданные аргументы$.proxy
частично применяются к функции, предварительно заполняя ее данными. Обратите внимание, что любые аргументы,$.post
переданные обратному вызову, будут применены в конце, поэтому ониdoSomething
должны быть в конце списка аргументов:Этот подход также позволяет нескольким аргументам быть привязанными к обратному вызову:
источник