2010-08-07 2 views
25

Я пытаюсь использовать jQuery для вызова некоторого пользовательского API через Ajax/$.getJSON.

Я пытаюсь передать пользовательское значение в метод обратного вызова Ajax, но это значение не проходит и фактически перезаписывается. Это мой код:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 

$("#loading_status").show(); 

$.getJSON(url, null, function(results, locationType) { 
    searchResults(results, locationType) 
}); 

Значение locationType ДО Я называю URL с использованием AJAX является 3. Но после того, как вызов возвращает данные успешно, значение для locationType теперь success. Это потому, что это method signature of the callback:

обратного вызова (данные, textStatus) Обратный вызов функция, которая выполняется, если запрос выполнен успешно.

Как передать один или несколько параметров методу обратного вызова?

+0

переменная locationType является глобальной переменной, поэтому вам не нужно положить его в качестве параметра в функцию обратного вызова Anonimus, что переменная свободна, так что поиск в окружающей среде, которая в данном случае является глобальной окружающей среды. – jcubic

+1

@jcubic - это не * глобальная переменная * (возможно, это может быть, но, вероятно, нет), более точно она доступна в области, о которой он беспокоится. –

ответ

19

Вам не нужно пройти его, просто ссылаться на переменную у вас уже есть, как это:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 
$("#loading_status").show(); 
$.getJSON(url, null, function(results) { 
    searchResults(results, locationType) 
}); 

Также нет никакой необходимости передавать null, если у вас нет объекта данных, это необязательный параметр Jquery проверяет, является ли вторыми пары функция или нет, так что вы можете просто сделать это:

$.getJSON(url, function(results) { 
    searchResults(results, locationType) 
}); 
+17

Вы должны быть осторожны с этим. Для переменной фиксированного значения это полезно, но если вы попытаетесь сделать это, например, внутри цикла, где locationType является индексом, его значение внутри обратного вызова будет значением в момент выполнения обратного вызова, а не значением в определение. На всякий случай! –

+0

@DanibISHOP: И как бы вы передали ни одно фиксированное значение? – Espen

+0

Не фиксированные значения могут быть полезны, если вы выполняете много вызовов API, а затем все еще должны знать, какой вызов возник из того, какой идентификатор вы загружаете. – mitchken

2

Если вы хотите использовать locationType (чье значение 3) в функции обратного вызова, просто использовать

function(results) { ..... 

благодаря closures, locationType будут автоматически доступны в функции обратного вызова.

18

Деформация в функции, например.

function getResults(locationType) { 
    $.getJSON(url, null, function(results) { 
     searchResults(results, locationType) 
    }); 
} 

Но в вас конкретной ситуации, вы даже не должны передать его, вы можете получить доступ к значению непосредственно в функции обратного вызова.

+3

, если вы выполняете цикл и вызываете $ .getJSON() каждый раз, а затем его завершение будет сохранять переменную; в противном случае он будет отменен. – yee379

3

вы можете использовать .ajax метод:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 
$.ajax({ 
    url: url, 
    context: { lt: locationType }, 
    success: function(results) { 
     searchResults(results, this.lt);  
    } 
}); 
+0

Я верю, что в приведенном выше кодеке есть ошибка. При использовании настройки контекста «это» становится контекстом в функции обратного вызова, поэтому код должен читать searchResults (results, this.lt); вместо поискаРезультаты (результаты, this.context.lt) ;. Я уже сделал исправление выше. –

0

Может попробовать:

function getResults(locationType) { 
    $.getJSON(url, {p1:'xxx', p2: 'yyy'}, function(results) { 
     searchResults(results, locationType) 
    }); 
} 
Смежные вопросы