javascript - jQuery 延迟无法解决

标签 javascript jquery promise jquery-deferred

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

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

最佳答案

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

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

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

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();
}

正因为如此 - promise 从未兑现。

关于javascript - jQuery 延迟无法解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443206/

相关文章:

javascript - 为什么当鼠标悬停在水平菜单上时,子菜单会消失

jquery - 缓存为空时获取音频文件的持续时间属性的问题

jquery - 让显示:none elem slideRight();

javascript - 带有 ES6/Bluebird promise 的对象方法

c++ - 何时在 async 或 packaged_task 上使用 promise?

javascript - 对以逗号分隔的数字字符串进行排序

javascript - 更新Jquery中li的标题属性

javascript - 如何优化javascript中的代码

c++ - std::promise<T> 是线程安全的吗?

javascript - jQuery切换()问题