JQuery отложено - PullRequest
       5

JQuery отложено

0 голосов
/ 02 марта 2011

У меня проблемы с обучением использованию нового jQuery Deferred.

Ajax-вызов, и я хочу вернуть данные AJAX-вызова.

checkIDExists = function(id){
    var exists = false;
    $.ajax({
        data: {
            method: "idExists",
            id: id
        },
        success: function(data){
                if(data == 'true'){
                    exists = true;
                }
        }
    }).done(function(){
        return exists;
    }).fail(function(){
        return false;
    });
};

Я знаю, что проблема возникает, когда я пытаюсь вернуть что-то внутри функций done () или fail (), которое не возвращает это для функции checkIdExists (). Как мне обойти это?

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

Насколько я знаю, утверждения Ллойда верны, но я не думаю, что это был именно тот ответ, который вы искали, вот моя попытка:

Прежде всего, при работе с отложенными обещаниями единственно разумныевещь, которую можно ожидать и предоставить в качестве возвращаемого значения, является объектом обещания (следовательно, почему Ллойд указывает вам на CPS).

Где бы вы обычно делали что-то вроде

/* Have some kind of callback for when ajax is done */

var myCompleteCallback = function(data){
   // whatever you want to do with your ajax call results
}

var myErrorCallback = function(){
   // handle the ajax error
}

/* Send the actual ajax request, and tell it to call MyCompleteCallback afterwards */

  $.ajax({
    url: '/foo/bar.xml'
    data: {},
    success: myCompleteCallback,
    error: 
  });

Вы хотели бы сделать это в реализации с отложенным стилем:

/* Have some kind of callback for when promise is resolved is done */

var myCompleteCallback = function(data){
   // whatever you want to do with your ajax call results
}

var myErrorCallback = function(){
   // handle the ajax error
}

/* you could also do ajax.done().fail() but i think this reads better as an example */

var getsomething = $.ajax({ url: '/foo/bar.xml', data: {} });
getsomething.then( myCompleteCallback, myErrorCallback ) 

Таккак видите, в этом нет ничего особенного и особенного, кроме случаев, когда вы начинаете разбираться с более сложными примерами.

Что тут крутого (следуя из предыдущего примера) ...

var getVisitorInfo = function(){

  /* stash the user information ajax call promise */

  var fetchUserInfo    = $.ajax({url:"/some/api/user.json"})

  /* stash the account information ajax call promise */

  var fetchAccountInfo = $.ajax({url:"/some/api/user.json"})

  /* trigger both calls and returns a promise that will resolve to both results */

  return $.when( fetchUserInfo,  fetchAccountInfo )
}

/* Usage: */

getVisitorInfo().done(function(userJSON, accountJSON){
   // manipulate your data/ui/and whatnot
}).fail(function(failure1,failure2){
   // redirect to login or whatever
})

Надеюсь, это поможет.Я бы посоветовал взглянуть на различные реализации отложенных / обещанных, чтобы лучше понять все это.Что ДЕЙСТВИТЕЛЬНО помогло мне, так это игра с библиотекой Криса Ковала Q (и отличного качества README, которую он предоставляет) и чтение об этом в CommonJS wiki .И Крис также дал доклад на эту тему еще в 2010 году

2 голосов
/ 02 марта 2011

Сам Ajax работает асинхронно, поэтому функция checkIDExists завершается раньше, чем вызов ajax возвращает данные с сервера.

В вашем случае я бы не стал полагаться на возвращаемое значение функции checkIDExists, но я бы перезаписал эту функцию, используя CPS подход.

...