当前位置: 首页 > 面试题库 >

链接两个异步jQuery函数时,如何完全避开jQuery Promise?

秦育
2023-03-14
问题内容

我已经看过许多有关新EMCA的教程,这些教程承诺提倡在jQuery库中避免“承诺”。他们通常说您可以通过执行以下操作来躲避他们:

Promise.resolve($.getJSON(url, params)); // voila!  the jQuery promise is "gone"!

但是,当我必须将两个异步jQuery函数链接在一起时,这实际上不起作用。我如何将两个getJSON调用(第二个调用取决于第一个调用)链接在一起而不使用jQuery的then()或.when()?

相反,我只想使用Promise.all等。

我认为类似的问题是交错jquery和EMCA Promise?


问题答案:

您可以采用两种方法之一…

转换然后合并:

var p1 = Promise.resolve($.getJSON(url_1, params_1)); // voila 1!
var p2 = Promise.resolve($.getJSON(url_2, params_2)); // voila 2!
var p3 = Promise.all([p1, p2]).then(...);

合并然后转换:

var p1 = $.getJSON(url_1, params_1);
var p2 = $.getJSON(url_2, params_2);
var p3 = Promise.resolve($.when(p1, p2)).then(...); // voila 1 and 2!

直截了当,两种方法都将为您提供本机的ES6 Promise,p3当两个jQuery Promise
都解决时,它就会解决;当其中一个Promise失败时,它就会被拒绝。

但是,您可能对这两个getJSON()调用的结果感兴趣,并且jQuery在这方面很尴尬。jQuery的jqXHR Promise将 多个
参数传递给它们的成功和错误回调,而ES6
Promise只接受一个。其余的将被忽略。幸运的是,将多个参数捆绑在一起以创建单个对象非常简单。必须先在jQuery中完成,然后再转换为ES6。

“转换然后合并”代码扩展如下:

var p1 = Promise.resolve($.getJSON(url_1, params_1).then(
    function(data, textStatus, jqXHR) {
        return { data:data, textStatus:textStatus, jqXHR:jqXHR };
    },
    function(jqXHR, textStatus, errorThrown) {
        return { jqXHR:jqXHR, textStatus:textStatus, errorThrown:errorThrown };
    }
));
var p2 = Promise.resolve($.getJSON(url_2, params_2).then(
    function(data, textStatus, jqXHR) {
        return { data:data, textStatus:textStatus, jqXHR:jqXHR };
    },
    function(jqXHR, textStatus, errorThrown) {
        return { errorThrown:errorThrown, textStatus:textStatus, jqXHR:jqXHR };
    }
));
var p3 = Promise.all([p1, p2]).then(
    function(results) {
        // results[0] will be an object with properties .data, .textStatus, .jqXHR 
        // results[1] will be an object with properties .data, .textStatus, .jqXHR 
    },
    function(rejectVal) {
        // rejectVal will be an object with properties .errorThrown, .textStatus, .jqXHR
    }
);

“合并然后转换”方法比较棘手,因为合并的结果(在jQuery中)显示为arguments列表,列表本身需要转换(仍在jQuery中)为数组。

var p1 = $.getJSON(url_1, params_1).then(
    function(data, textStatus, jqXHR) { 
        return { data:data, textStatus:textStatus, jqXHR:jqXHR }; 
    },
    function(jqXHR, textStatus, errorThrown) { 
        return { errorThrown:errorThrown, textStatus:textStatus, jqXHR:jqXHR }; 
    }
);
var p2 = $.getJSON(url_2, params_2).then(
    function(data, textStatus, jqXHR) { 
        return { data:data, textStatus:textStatus, jqXHR:jqXHR };
    },
    function(jqXHR, textStatus, errorThrown) { 
        return { errorThrown:errorThrown, textStatus:textStatus, jqXHR:jqXHR }; 
    }
);
var p3 = Promise.resolve($.when(p1, p2).then(function() {
    return [].slice.call(arguments);// <<< convert arguments list to Array
})).then(
    function(results) { 
        // results[0] will be an object with properties .data, .textStatus, .jqXHR
        // results[1] will be an object with properties .data, .textStatus, .jqXHR
    },
    function(rejectVal) { 
        // rejectVal will be an object with properties .errorThrown, .textStatus, .jqXHR
    }
);


 类似资料:
  • 我被要求创建一个名为的对象,它可以链接函数和。 例如: 在此场景中,它首先打印早餐,等待3秒钟,打印午餐,然后在3秒钟后打印晚餐。 我试过这样的东西,但没用。我错过了什么?

  • 我想链接一个在循环中多次调用的异步ajax函数。为什么?因为这个功能是上传文件,但我希望它能连续上传文件,而不是一次上传所有文件。我不想使用async false,因为我希望在DOM上更新进度。 我不明白jquery延迟对象是如何工作的。

  • 问题内容: 我想制作一个页面来显示数据库中的一些数据,因此我创建了一些函数来从数据库中获取数据。我只是Node.js的新手,据我了解,如果我想在一个页面中使用所有这些内容(HTTP响应),则必须将它们全部嵌套: 如果有很多类似的功能,那么 嵌套就会成为问题 。 有办法避免这种情况吗?我想这与如何组合多个异步函数有关,这似乎是基本的东西。 问题答案: 有趣的观察。请注意,在JavaScript中,您

  • 问题内容: 我想制作一个页面来显示数据库中的某些数据,因此我创建了一些函数来从数据库中获取该数据。我只是Node.js中的新手,据我了解,如果我想在一个页面中使用它们(HTTP响应),则必须将它们全部嵌套: 如果有很多类似的功能,那么 嵌套就会成为问题 。 有办法避免这种情况吗?我想这与如何组合多个异步功能有关,这似乎是基本的东西。 问题答案: 有趣的观察。请注意,在JavaScript中,通常可

  • 我有两个完整的。我想做以下场景:如果第一个Completable到达onComplete,继续第二个Completable。最终结果将是完成第二个可完成项。 这就是我在使用单getUserIdAlreadySavedInDevice()和Compltable login()时的做法:

  • 问题内容: 我在NodeJS中有一个forEach循环,遍历一系列键,然后从Redis异步检索其值。循环和检索完成后,我想返回该数据集作为响应。 我目前的问题是因为数据检索是异步的,发送响应时没有填充我的数组。 如何在我的forEach循环中使用promise或回调,以确保响应与数据一起发送? 问题答案: 我在这里使用Bluebird Promise 。请注意,代码的意图非常清晰并且没有嵌套。 首