【问题标题】:jQuery Promises and Deferred, confusionjQuery Promises 和 Deferred,混淆
【发布时间】:2014-09-20 06:10:15
【问题描述】:

我以为我终于明白了承诺,但似乎我有点迷失了。

任何人都可以让我摆脱痛苦并解释我在这里做错了什么:

t010 = { myGet: function(url) { var result = new $.Deferred(); result.resolve(ajaxRequest(url)); } }

然后由我的主要方法调用:

$.when(t010.myGet(seatId), t010.myGet(roomId)).then(function(d1, d2) { console.log(d1); }

我只是每次都未定义控制台日志。

我认为我想要实现的目标相当明显,我想调用 myGet 两次,并在两者都完成后对结果进行处理。

谢谢大家!

【问题讨论】:

    标签: javascript jquery promise deferred


    【解决方案1】:

    你必须返回promise才能使用$.when

    t010 = {
      myGet: function(url) {
        var result = new $.Deferred();
        result.resolve(ajaxRequest(url));
    
        return resolve.promise();
      }
    }
    

    但这会立即解决承诺,将ajaxRequest 函数的结果传回,当时可能是undefined
    但是,ajaxRequest 看起来已经像返回了一个承诺,你可以直接返回它

    t010 = {
      myGet: function(url) {
        return ajaxRequest(url));
      }
    }
    

    假设你的 ajax 函数看起来像

    function ajaxRequest(url) {
    
        return $.ajax({
            url : url
        });
    
    }
    

    【讨论】:

    • 我明白,是的,我认为我的问题在于我必须使用的 ajaxRequest 函数,因为它返回 return $.ajax(defaults).promise().then(function (data) { try { return JSON.parse(data); } catch (e) { return data; },因此我什么也没得到。
    • 你不能像那样从函数返回数据,因为它是异步的,你真正需要的是return $.ajax(defaults);,然后执行then()(可能是done())你调用它的函数,ajaxRequest(url).done(function(data) {}); 等,你可以在$.when 等中包装多个。
    • 我无法控制返回那个烦人的函数(至少现在不是),所以我不得不按原样使用它,我认为如果不改变它就无法工作那么ajax函数呢?
    • 它应该,看起来你的 ajax 函数已经返回了一个承诺,所以只需尝试链接一个处理程序,看看会发生什么,比如ajaxRequest(url).always(function() { console.log(arguments) });,看看它做了什么?
    • 谢谢,移动 ajax 函数并像原来的答案一样使用它,最终效果很好!
    猜你喜欢
    • 2013-09-28
    • 2016-02-22
    • 2014-04-12
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多