【问题标题】:jQuery Deferred Won't ResolvejQuery Deferred 无法解决
【发布时间】:2014-06-27 02:52:13
【问题描述】:

我有一个这样的服务助手设置:

var service = {

getSettings: function () {

    var that = this,
     deferred = $.Deferred();

    that.getThingOne().done(function (data) {

        that.getThingTwo(data.Element).done(function (data) {

            deferred.resolve(data);
        });
    });
    return deferred.promise();
},

getThingTwo: function (elm) {

    return $.getJSON('http://ajax-call-here');
},

getThingOne: function () {

    var deferred = $.Deferred();
    navigator.geolocation.getCurrentPosition(deferred.resolve, deferred.reject, {
        enableHighAccuracy: true
    });
    return deferred.promise();
}

};

当我调用它做这样的事情时,我永远不会到达下面。怎么回事?

service.getSettings().done(function(data) {

    // never reach here
});

【问题讨论】:

  • 我看不出你的逻辑有什么问题。您是否插入了console.log() 语句并在您停止看到进展之前找出您的进展程度?
  • @aherrick,你搞定了吗?

标签: javascript jquery promise jquery-deferred


【解决方案1】:

首先 - 您可以大大简化您的代码。 Promises 链是对延续本身概念的抽象。

getSettings: function () {
    var that = this; // this line can be avoided as well
    return this.getThingOne().then(function (data) {
        // returning from a `.then` will cause the promise to resolve with that
        // return value
        return that.getThingTwo(data.Element); 
    });
}

其次,你的承诺不起作用。尝试保留上下文:

getThingOne: function () {

    var deferred = $.Deferred();
    navigator.geolocation.getCurrentPosition(
    function(v){ deferred.resolve(v); }, // preserve context
    function(e){ deferred.reject(e;) }, { // here too
        enableHighAccuracy: true
    });
    return deferred.promise();
}

因此 - 承诺从未得到解决。

【讨论】:

  • jQuery 的deferred.resolvedeferred.reject 方法是可分离的;他们的上下文是绑定的。所以 OP 写的是(语法上)正确的。 ...getCurrentPosition(deferred.resolve, deferred.reject, ...); 是否正确调用 API 是另一回事。
  • 您的第二个问题在 jQuery 中不是问题(违反直觉,但 jQuery 已经做了一些事情)。你可以在这里看到它:jsfiddle.net/jfriend00/X6eLV。为什么 OP 的代码实际上不起作用仍然是个谜,但显然您的第一个建议是一种更清洁的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2014-12-18
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多