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

时间:2012-03-21 15:34:39

标签: jquery dojo jquery-deferred deferred

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

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

我认为length会从上面的函数中获取返回的length属性的值,但事实并非如此。 res的值不会被链接。但是如果我在dojo中编写这段代码,它就会像我预测的那样工作:

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

如何让jQuery以我想要的方式工作?

2 个答案:

答案 0 :(得分:1)

我想你想要deferred.pipe

答案 1 :(得分:0)

这是因为jQuery的延迟'then'方法返回自己。即,您在同一个延迟对象中添加了两个处理程序。 但是dojo的延迟'then'方法为deferred的链接返回了新的方法。 它似乎是由你知道的jQuery API风格引起的 - Method chaining。几乎所有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.");    
    }