2014-02-18 3 views
0

У меня есть следующие функции:Используя функцию с deferred.done()

function checkTag(dataVal) { 
    return $.ajax({ 
     data: {input: dataVal} 
     ... 
    }); 
} 

В настоящее время на KeyUp, что функция вызывается как таковой:

$("#element").on("keyup", function() { 
    var tag = $(this).val(); 
    checkTag(tag).done(function(data) { 
     ... 
    }); 
}); 

и работает без проблем , Однако позже в моем коде я хочу снова называть это deferred.done(). Я поэтому создал функцию как таковую:

function checkTagDone(data) { 
    ... 
} 

И попытался назвать это так:

checkTag(tag).done(checkTagDone(data)); 

, а также попробовал:

$.when(checkTag(tag)).done(checkTagDone(data)); 

, но в обоих случаях я получаю variable 'data' is not found на консоли. Я, очевидно, неправильно понял использование deferred.done, но должен быть способ итерации по сравнению с тем же deferred.done без необходимости репликации кода. Я могу найти документацию для поддержки нескольких экземпляров deferred.done, следующих за одним вызовом AJAX, но нигде не могу найти решение для репликации того же deferred.done, следующего за несколькими вызовами AJAX.

Соответствующие JQuery для object htmlinputelement выпуска:

function checkTagDone(data, tag) {  
    if (data) { 
     ... 
     //Create span around tag input 
     $(".tree").last().append("<span class='tag'>"+tag+"</span>").fadeIn(500).val(""); 
     ... 
    } 
} 

ответ

2

Вам необходимо передать ссылку на функцию done как и передать значение tag методу checkTag (Потому что от того, что я могу видеть tag является локальной переменной в области keyup.).

checkTag($("#element").val()).done(checkTagDone); 

var tag = $("#element").val(); 
checkTag(tag).done(function (data) { 
    checkTagDone(data, tag); 
}); 
+0

Спасибо за ваше предложение. Я попробовал, но вместо возвращаемого значения я получаю 'object htmlinputelement' ?? – Ryan

+0

@Ryan, в каком методе –

+0

В 'checkTagDone'. Я действительно ссылаюсь на тег в моем методе checkTagDone, поэтому предположительно заменяя 'tag' в' checkTag' самим селектором, как вы предположили, вызывает проблему, поскольку эта ссылка теперь недействительна? – Ryan

0

Райан, вы, кажется, есть два варианта:

Оставьте обработчик события, как это, и вызвать событие KeyUp повторно выполнить Аякса на текущее значение элемента

$("#element").trigger('keyup'); 

Это может быть осуществлено в любой момент в вашем коде. Нет проблем с областью, так как весь код имеет доступ к DOM.

Изменение обработчика событий таким образом, что он сохраняет самый последнее обещание АЯКС во внешней области видимости

var lastKeyupPromise; 
... 
$("#element").on('keyup', function() { 
    lastKeyupPromise = checkTag($(this).val()).done(checkTagDone); 
}); 

Затем, в другом месте в коде:

if(lastKeyupPromise) { // safety is required as `lastKeyupPromise` may still be undefined 
    lastKeyupPromise.done(checkTagDone); 
} 

Это может быть выполнено в любом точка в вашем коде, обеспечивающая lastKeyupPromise и checkTagDone.

Преимущества второго ПОДХОД являются:

  • Нет необходимости выполнять другой запрос AJAX.
  • Вы не ограничены исполнением checkTagDone. Вы можете выбрать выполнить то, что подходит в этой точке вашего кода.

Например:

if(lastKeyupPromise) { 
    lastKeyupPromise.done(someOtherHandler); 
} 
Смежные вопросы