【问题标题】:jQuery, simultaneours ajax calls and $.whenjQuery,同时 ajax 调用和 $.when
【发布时间】:2015-05-05 04:59:40
【问题描述】:

当使用 $.ajax().done 时,此刻,你可以做一些简洁的事情:

$.getJSON('url').done(myFn);
$.getJSON('url2').done(myFn2);

但是当你使用 $.when 和相同的 2 个 ajax 调用时,你需要执行一个“奇怪”的事情

$.when($.getJSON('url'), $.getJSON('url2')).done(function(res1, res2) {
    myFn(res1[0], res1[1], res1[2]);
    myFn2(res2[0], res2[1], res2[2]);
});

有没有办法做类似的事情:

$.when($.getJSON('url'), $.getJSON('url2')).done(myFn, myFn2);

也就是说,当您将多个函数传递给 done 时,它​​们会以相同的顺序为每个参数解析?

编辑:这里有来自我希望的用例的更多信息:

$.when($.getJSON('tweets'), $.getJSON('users'))
    .done(rememberTweets, rememberUsers)
    .done(displayTweetsWithUsers)

目前,我愿意:

var tweets, users;
$.when($.getJSON('tweets'), $.getJSON('users'))
    .done(function(tweetsRes, usersRes) { 
         tweets = tweetsRes[0]; 
         users = usersRes[0];
         displayTweetsWithUsers();
    });

【问题讨论】:

  • 你的问题对我来说没有意义。你的意思是你不想等待两个请求都完成,而是单独触发他们的.done() 回调?那你为什么要使用$.when
  • 就我而言,我想要: $.when($.getJSON('url'), $.getJSON('url2')).done(myFn, myFn2).done(我的继续Fn);也就是说, myFn 和 myFn2 正在记住 myContinuationFn 的数据,但我想将其与数据处理分开。现在有意义吗?
  • 你当前的代码看起来很乱。为什么要使用全局的tweetsusers 变量,为什么不向那个显示函数传递任何东西呢?不是很好的做法。
  • 变量在用于 jqury 插件的闭包中作用域。所以这些变量被其他方法使用。 ...

标签: jquery ajax promise


【解决方案1】:

你需要做一件“奇怪”的事情

不是真的,我认为你的语法很好地表达了你在做什么。如果你认为应该有一个速记 - 不,没有,因为你想做的事情奇怪的(一个不寻常的用例)。

如果您需要这个的通用版本,请使用

function zipMapper(fns) {
    return function() {
        var args = arguments;
        return fns.map(function(f, i) {
            return args[i].length ? f.apply(this, args[i]) : f.call(this, args[i]);
        }, this);
    };
}

$.when($.getJSON('url'), $.getJSON('url2')).then(zipMapper([myFn, myFn2]);

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2012-11-12
    • 1970-01-01
    • 2016-09-25
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多