Что мне не хватает? Цепные обещания в jQuery и Dojo - PullRequest
2 голосов
/ 21 марта 2012

Следующий код не работает так, как я предсказывал:

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

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

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

Что мне делать, чтобы заставить jQuery работать так, как я хочу?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

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

0 голосов
/ 23 марта 2012

Это потому, что метод 'then' в jQuery возвращает себя сам. А именно, вы добавили два обработчика в один и тот же отложенный объект. Но метод dojo для deferred 'then' возвращает новый метод для цепочки deferred. Это, как вы знаете, вызвано стилем jQuery API - Метод цепочки . Почти все 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.");    
    }
...