2015-03-26 2 views
1

У меня проблема с тем, что мне нужны разные маршруты обратного вызова для одного и того же запроса AJAX, потому что когда-то необходимо использовать ту же функцию (то есть получить информацию о идентификаторе продукта или что-то подобное).Запрос AJAX с раздвоенным обратным вызовом

Что работает, что-то вроде этого:

function1() { 
    $.ajax({ 
    url: "test.html", 
    context: document.body 
    }).done(function() { 
    route1function(); 
    }); 
} 
function2() { 
    $.ajax({ 
    url: "test.html", // do the same crap here... 
    context: document.body 
    }).done(function() { 
    route2function(); 
    }); 
} 
function3() { 
    $.ajax({ 
    url: "test.html", // and here again *yawn* 
    context: document.body 
    }).done(function() { 
    route3function(); 
    }); 
} 

Copy & Paste кодирование является злом, так что моя идея состояла в том, чтобы сделать что-то вроде:

doMyAmazingStuff(iRoute) { 
    $.ajax({ 
    url: "test.html", 
    context: document.body 
    }).done(function() { 
    switch(iRoute) { 
     case 1: 
      route1function(data); 
      break; 
     case 2: 
      route2function(data); 
      break; 
      // and so on... 
    } 
    }); 
} 

К сожалению, iRoute НЕ будут переданы в .done и не определена. Любые альтернативы, как пережить такие переменные? Копировать/вставить/вставить/вставить ... как в первом примере нет опции (и плохой стиль). Я думаю, что сделать это глобальным охватом (установка переменной тени без объявления ее с помощью var) не является хорошим решением.

+0

«iRoute НЕ будет передан функции .done и не определен»: вы уверены в этом утверждении, потому что я не думаю, что это правильно. Вы проверили это, чтобы убедиться? – Andy

+0

Если я добавлю console.log (iRoute), я получу undefined. – DatLicht

+0

Тогда вы делаете что-то не так, я боюсь. См. Мой ответ ниже. – Andy

ответ

1

Во-первых, ваше утверждение «iRoute НЕ будет передано функции .done и не определено» неверно. Если вы перейдете в iRoute к своей функции, он не будет определен. См. this demonstration. Я передаю в 1 как аргумент функции, и предупреждение в функции done предупреждает это число.

Возможно, существует более аккуратный способ написания этого кода, но это почти тот же код - это просто означает использование интерфейса обещаний AJAX, чтобы вместо этого вернуть данные из отдельной функции.

function getData() { 
    return $.ajax({ 
    url: "test.html", 
    context: document.body 
    }); 
} 

function doMyAmazingStuff(iRoute) { 
    getData.done(function (data) { 
    switch(iRoute) { 
     case 1: 
     route1function(data); 
     break; 
     case 2: 
     route2function(data); 
     break; 
    } 
    }); 
} 

doMyAmazingStuff(1); 
+0

хорошо, нашел ошибку. Три разных точки входа, одна с отсутствующим значением. Ты прав. Благодаря :-) – DatLicht

Смежные вопросы