2012-03-21 6 views
2

Следующий код не работает так, как предсказывал:Что мне не хватает? СЦЕПЛЕНИЕ обещает в JQuery и Dojo

jQuery.get("/api/resource/1") 
     .then(function(res){ return res.length; }) 
     .then(function(res){ var length = res; }); 

Я думал length бы получить значение возвращаемой длины имущества из приведенной выше функции, но это не так. Значение res не будет привязано. Но если я пишу этот код в додзё, он будет работать, как я предсказывал:

dojo.xhrGet({url:"/api/resource/1"}) 
    .then(function(res){ return res.length; }) 
    .then(function(res){ var length = res; }); 

Что я должен сделать, чтобы сделать JQuery работать так, как я хочу?

ответ

1

думаю, вы хотите deferred.pipe.

+0

Спасибо! Функция pipe отлично работает в новых версиях jQuery. К сожалению, я застрял в jQuery 1.5.2 (это сайт Drupal). Даже если это работает, я не понимаю, почему JQuery реализован таким образом. Я думаю, что это сбивает с толку. Если я хочу использовать одно и то же значение, я возвращаю то же значение, правильно? –

0

Это потому, что метод 'then' отложенного jQuery возвращает себя. А именно, вы добавили два обработчика в один и тот же отложенный объект. Но метод 'then' отложенного dojo's возвращает новый для цепочки отложенных. Это похоже на стиль API jQuery, как вы знаете - Method chaining. Почти все API-интерфейсы jQuery возвращаются для шаблона цепочки методов.

var def1 = ​$.get("/echo/json").then(function(res) { console.dir(res); 
         return res; }); 
    var def2 = def1.then(function(res) { console.dir(res); 
           return res; }); 
    ​​​​​​​​if (def1 === def2) { 
     console.log(">>> same deferred object."); 
    } else { 
     console.log(">>> different deferred object.");  
    } 
Смежные вопросы