我错过了什么?在jQuery和Dojo中链接承诺

我错过了什么?在jQuery和Dojo中链接承诺,jquery,dojo,jquery-deferred,deferred,Jquery,Dojo,Jquery Deferred,Deferred,以下代码的工作方式与我预测的不同: jQuery.get("/api/resource/1") .then(function(res){ return res.length; }) .then(function(res){ var length = res; }); dojo.xhrGet({url:"/api/resource/1"}) .then(function(res){ return res.length; }) .then(function(

以下代码的工作方式与我预测的不同:

jQuery.get("/api/resource/1")
      .then(function(res){ return res.length; })
      .then(function(res){ var length = res; });
dojo.xhrGet({url:"/api/resource/1"})
    .then(function(res){ return res.length; })
    .then(function(res){ var length = res; });
我原以为
length
会从上面的函数中获取返回的length属性的值,但事实并非如此。res的值不会被链接。但如果我用dojo编写这段代码,它将像我预测的那样工作:

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

我该怎么做才能使jQuery按我想要的方式工作呢?

我想你是想要的。

这是因为jQuery的deferred's'then'方法会自动返回。也就是说,在同一个延迟对象中添加了两个处理程序。 但是dojo的deferred'then'方法为deferred的链接返回新的方法。 正如您所知,这似乎是由jQueryAPI的风格造成的。几乎所有jQuery的API都返回方法链接模式

    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.");    
    }

谢谢管道函数在较新版本的jQuery中运行良好。不幸的是,我一直使用jQuery1.5.2(这是一个Drupal站点)。即使它能工作,我也无法理解为什么JQuery是以这种方式实现的。我认为这令人困惑。如果我想使用相同的值,我会返回相同的值,对吗?