在这篇文章中,我们将带领您了解链接两个异步jQuery函数时,如何完全避开jQueryPromise?的全貌,包括jquery怎么解决异步转同步的相关情况。同时,我们还将为您介绍有关AMD异步模块定义
在这篇文章中,我们将带领您了解链接两个异步jQuery函数时,如何完全避开jQuery Promise?的全貌,包括jquery怎么解决异步转同步的相关情况。同时,我们还将为您介绍有关AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery、ES6~Promise原理及使用三 搞懂jquery中的Promise(摘取自:https://www.cnblogs.com/lvdabao/p/jquery-deferred.html)、google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)、google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)_jquery的知识,以帮助您更好地理解这个主题。
本文目录一览:- 链接两个异步jQuery函数时,如何完全避开jQuery Promise?(jquery怎么解决异步转同步)
- AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery
- ES6~Promise原理及使用三 搞懂jquery中的Promise(摘取自:https://www.cnblogs.com/lvdabao/p/jquery-deferred.html)
- google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
- google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)_jquery
链接两个异步jQuery函数时,如何完全避开jQuery Promise?(jquery怎么解决异步转同步)
我已经看过许多有关新EMCA的教程,这些教程承诺提倡在jQuery库中避免“承诺”。他们通常说您可以通过执行以下操作来躲避他们:
Promise.resolve($.getJSON(url, params)); // voila! the jQuery promise is "gone"!
但是,当我必须将两个异步jQuery函数链接在一起时,这实际上不起作用。我如何将两个getJSON调用(第二个调用取决于第一个调用)链接在一起而不使用jQuery的then()或.when()?
相反,我只想使用Promise.all等。
我认为类似的问题是交错jquery和EMCA Promise?
答案1
小编典典您可以采用两种方法之一…
转换然后合并:
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 });
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery
AMD 模块
AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一个可用的模块化 JavaScript 的解决方案。
AMD 模块格式本身是一个关于如何定义模块的提案,在这种定义下模块和依赖项都能够异步地进行加载。它有很多独特的优势,包括天生的异步及高度灵活等特性,这些特性能够解除常见的代码与模块标识间的那种紧密耦合。目前它已经被很多项目所接纳,包括jQuery(1.7)。
RequireJS
RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范。
jQuery 对AMD的支持
jQuery 1.7 开始支持将 jQuery 注册为一个AMD异步模块。有很多兼容的脚本加载器(包括 RequireJS 和 curl)都可以用一个异步模块格式来加载模块,这也就表示不需要太多 hack 就能让一切运行起来。可以看看jQuery 1.7 中的源码:
// Expose jQuery as an AMD module, but only for AMD loaders that
// understand the issues with loading multiple versions of jQuery
// in a page that all might call define(). The loader will indicate
// they have special allowances for multiple jQuery versions by
// specifying define.amd.jQuery = true. Register as a named module,
// since jQuery can be concatenated with other files that may use define,
// but not use a proper concatenation script that understands anonymous
// AMD modules. A named AMD is safest and most robust way to register.
// Lowercase jquery is used because AMD module names are derived from
// file names, and jQuery is normally delivered in a lowercase file name.
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
define( "jquery", [], function () { return jQuery; } );
}
其工作的原理是,所使用的脚本加载器通过指定一个属性,即 define.amd.jQuery 为 true,来标明自己可以支持多个 jQuery 版本。如果有兴趣了解特定的实现细节的话,我们可以将 jQuery 注册为一个具名模块,因为可能会有这样的风险,即它可能被与其它使用了 AMD 的 define() 方法的文件拼合在一起,而没有使用一个合适的、理解匿名 AMD 模块定义的拼合脚本。
高版本的jQuery (1.11.1) 去掉了define.amd.jQuery判断:
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
});
}