文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值的弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、协程中调用挂起函数返回集合 一、以异步返回返回多个返回值 ----...在 Kotlin 协程 Coroutine 中 , 使用 suspend 挂起函数 以异步的方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 协程】协程的挂起和恢复 ① ( 协程的挂起和恢复概念...sequence 中调用挂起函数返回多个返回值 ---- 尝试使用 挂起函数 kotlinx.coroutines.delay 进行休眠 , 这样在挂起时 , 不影响主线程的其它操作 , 此时会报如下错误...SequenceScope 对象的方法 ; 在该匿名函数中 , 不能调用 SequenceScope 之外定义的挂起函数 , 这样做是为了保证该类的执行性能 ; /** * 构建一个[Sequence...---- 如果要 以异步方式 返回多个返回值 , 可以在协程中调用挂起函数返回集合 , 但是该方案只能一次性返回多个返回值 , 不能持续不断的 先后 返回 多个 返回值 ; 代码示例 : package
/sw.js#容易造成SW脚本获取路径不一致 在加载前,我们最好判断一下dom是否加载完了,不然安装sw可能会卡dom 加载完成后,register函数将返回一个Promise,由于前端大多不适用于异步...由于sw不可访问window,在sw中是无法使用ajax或XMLHTTPRequest。同时,fetch是一个异步函数,直接调用它会返回一个Promise。...并行请求 / Request Parallelly SW中又一大黑科技隆重登场=>Promise.any,这个函数拥有另外两个衍生兄弟Promise.all&Promise.race。...Promise.race 此函数也是并行执行,不过与all不同的是,只要有任何一个函数完成,就立刻返回,无论其是否reject或者resolve。...caches.match(req)将会试图在CacheStorage中匹配请求的url获取值,然后丢给管道同步函数then,传参resp为Cache匹配到的值。
虽然jQuery.Deferred的出现会导致初接触Promise的朋友产生不少的误解,但同时证明了Promises/A+规范的实现已成为开发过程中必不可少的利器了。 ...辅助方法——jQuery.when 功能就是等待所有入参均返回值后,以这些返回值为入参调用回调队列的函数 $.when = function(object) { var args = arguments...的开发团队意识到jQuery.Deferred的实现与Promises/A+规范相距甚远,于是在1.6版本上补丁式地为EnhancedDeferred增加了一个 pipe方法 ,从而实现回调函数的责任链...而比较大的局部功能重构是jQuery.Deferred的then方法被重构成为pipe方法的别名,而pipe函数的实现为Promise/A规范中的then方法,因此1.8的then方法与旧版本的then...中then函数的实现方式与旧版本的不同,埋下了兼容陷阱,但由于jQuery.Deferred受众面少(直接使用Ajax、effects和queue模块的Promise形式的API较多),因此影响范围不大
当时,相对成熟的 Dojo 在流行方面可以与初出茅庐的 Jquery 相媲美(争夺人气),虽然 Deferred 模式最早出现于 Dojo 代码中,但被广为所知却来源于 Jquery 1.5 版本,这也是...Jquery 中的一个重要的转折点,在这个版本之后引入了一个新的功能 Deferred,它彻底的改变了在 Jquery 中如何使用 Ajax,几乎重写了 Jquery 的 Ajax 部分。...在上一节,我们讲到了在早期我们都是通过使用回调(Callback)的形式向服务器发起网络请求,随后通过注册的回调函数拿到返回的数据,当时我们也提到了基于 Callback 的形式很容易造成回调函数嵌套、...Ajax 中的 Deferred 对象 Jquery 1.5 之前的 ajax 书写方式: // 返回的是 XHR 对象 $.ajax({ url: "http://openapi.xxxxxx.com...为了避免这种情况,jQuery 1.5 之后提供了 deferred.promise() 方法,作用是在 deferred 对象上返回 deferred 的 promise 对象,仅能使用与执行状态无关的方法
一般来说,只要参数是一个函数,那么这个函数就是回调。 请看我写的封装的简易jQuery.ajax()中的successFN就是一个回调函数....代码都在这里 3.1 $.Ajax()中的promise 如果不使用promise,$.ajax请求的时候成功和失败的回调函数是写在参数里的,他是对象参数的一个值 $.ajax({ method...PS:ajax()函数参数里的dataType:'json'//预期服务器返回的数据类型,如果不写,就是响应里设置的 即: ajax方法中的dataType:预期服务器返回的数据类型。...4封装一个类似$.Ajax()中的Promise的简易版本(皮毛,以后深入) 接下来回到我们自己封装的jQuery.Ajax()代码.我们以此为基础继续来封装promise 以前封装的代码在这里 也可以看我前一篇博客...,失败就调用then()函数第二个参数里的函数 简单的Promise原理: 自己封装后的Ajax()返回一个new出来的 Promise对象,一个Promise实例,这个Promise实例有一个then
这就解释了第一段的关键:函数应当返回一个新的 promise 对象。JQuery(1.8 以前的版本)却不这么做。他们只是继续使用原有的 promise 对象,但是把它的状态改变一下而已。...然而,不幸的是,像 JQuery 这样的类库却破坏了这条守则,它迫使丑陋的 hack 代码去检测这些冒充 promises 的对象—— 虽然 JQuery 依然在 API 文档里面号称这是“promise...; } 如果 API 的使用者坚持使用 JQuery promises 的话,你大概只有两种选择:在执行过程中莫名其妙地、令人困惑地失败,或者彻底失败,并且阻塞你继续使用整个类库。这可真糟糕啊。...值得注意的是,在写这篇文章的时候,JQuery 的最新版本是 1.9.1,它的 promises 在错误处理上的实现是完全错误的。...我希望在接下去的 JQuery 2.0 版本中参考 Promises/A+的文档,修正这个问题。
通常情况下,通过对构造函数使用 new 会返回一个绑定到 this上的新实例,所以我们可以在 new 出来的对象上直接用 . 访问其属性和方法。如果在普通函数中也返回当前实例,那么我们就可以使用 ....链模式不一定必须返回 this 在方法中不一定 return this,也可以返回其他对象,这样后面的方法可以对这个新对象进行其他操作。...比如在 Promise 的实现中,每次 then方法返回的就不是 this,而是一个新的 Promise,只不过其外观一样,所以我们可以不断 then下去。...源码中的链模式 3.1. jQuery 中的链模式 1. jQuery 构造函数 jQuery 方法看似复杂,可以简写如下: var jQuery = function (selector, context..._wrapped; }; 此处源码位于 underscore.js#L1668-L1670 总结一下,只要一开始调用了 chain方法, _chain这个标志位就会被置为 true,在类似的方法中,返回的值都用
简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。...由于Fetch模块返回的是一个Promise对象,因此要用then方法调用下一个next 方法。...返回值是 Promise。 async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。...Promise 的基本用法就谈到这,更深入用法,请参考阮一峰的ECMAScript 6 入门 特别需要指出的是在ES6之前,promise是一套规范和原则,只要设计的库复合规范的要求就都可以算是promise...ES6后,将Promise 众多规范中的一种写入语言标准,ES6中的 Promise 是其中一种,各个 Promise 规范之间有细微的差别(主要是特性上的) 参考来源: ECMAScript 6 入门
通常的做法是,为它们指定回调函数(callback)。即事先规定,一旦它们运行结束,应该调用哪些函数。 但是,在回调函数方面,jQuery的功能非常弱。...在英语中,defer的意思是"延迟",所以deferred对象的含义就是"延迟"到未来某个点再执行。 它解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口。...前面部分的ajax操作时,deferred对象会根据返回结果,自动改变自身的执行状态;但是,在wait()函数中,这个执行状态必须由程序员手动指定。...; }); d.resolve(); // 此时,这个语句是无效的 (运行代码示例9) 在上面的这段代码中,wait()函数返回的是promise对象。...(2) deferred.done() 指定操作成功时的回调函数 (3) deferred.fail() 指定操作失败时的回调函数 (4) deferred.promise() 没有参数时,返回一个新的
ES2015:使用Promise对象与then方法链式调用 第二种改进的方案,不使用回调函数,而是使用ES2015中新增的Promise及其then方法,下面以示例二进行改造: function foo...jQuery成名在前,在ES2015标准诞生之前,jQuery的DeferredObject就已经被定义了。...Promise本身并没有神奇的地方,它可以发挥作用,主要依赖的是在JS中,Object是引用对象,继承于Object原型的Promise也是引用对象,当异步操作发起时,只有一个“空”的Promise被创建了...小结 在JS中处理异步调用的结果,最佳实践就是“异步转同步”:使用Promise + async/await语法关键字。...在这里async总是与await成对出现,一个async函数总是返回一个Promise,一个await关键字总是在尝试“解开”一个Promise,结局要么等到有价值的数据,要么异步出现异步,什么也没有等到
例如,使用Promise API执行异步调用远程服务,但是在发起请求前你并不知道返回的数据对象是什么样子,你可以创建一个Promise对象作为未来某个时间返回的数据对象,在此期间, Promise对象扮演了真实数据的代理角色...enqueue(task Function) 尽可能快地在接下来的事件循环调用 task 方法。 get(object, name) 返回一个获得对象属性的 promise 。...makePromise(descriptor Object, fallback Function) 返回一个 promise 对象,该对象必须是一个可调用的函数,也可能是可被实例化的构造函数。...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。
接下来,你可以在 Promise 对象上绑定一个回调函数,一旦真实数据变得可用这个回调函数将会被调用。 Promise 对象曾经以多种形式存在于许多语言中。...makePromise(descriptor Object, fallback Function) 返回一个 promise 对象,该对象必须是一个可调用的函数,也可能是可被实例化的构造函数。...5. promiseSend方法可能接受变参 6. promiseSend方法必须返回undefined 对 Promises/B 规范的补充 Promises/D 规范中对 Promises/B 规范中定义的...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。
例如,使用Promise API执行异步调用远程服务,但是在发起请求前你并不知道返回的数据对象是什么样子,你可以创建一个Promise对象作为未来某个时间返回的数据对象,在此期间, Promise对象扮演了真实数据的代理角色...enqueue(task Function) 1 尽可能快地在接下来的事件循环调用 task 方法。 get(object, name) 1 2 返回一个获得对象属性的 promise 。...makePromise(descriptor Object, fallback Function) 返回一个 promise 对象,该对象必须是一个可调用的函数,也可能是可被实例化的构造函数。...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。
例如,使用Promise API执行异步调用远程服务,但是在发起请求前你并不知道返回的数据对象是什么样子,你可以创建一个Promise对象作为未来某个时间返回的数据对象,在此期间, Promise对象扮演了真实数据的代理角色...如果 then 不是函数,以 x 为参数执行 promise 如果 x 不为对象或者函数,以 x 为参数执行 promise 如果一个 promise 被一个循环的 thenable 链中的对象解决,...enqueue(task Function) 尽可能快地在接下来的事件循环调用 task 方法。 get(object, name) 返回一个获得对象属性的 promise 。...此外,在 Promises/A 规范中,由 then 方法生成的 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用的那个回调是返回值还是抛出错误。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。 最后一个例子揭示了,实现 Promise 的关键是实现好 doResolve 方法,在完事以后触发回调。
onRejected回调中抛出了异常,那么.catch返回的Promise实例的状态也将变成rejected。...你可以通过修改以下代码中的注释部分来验证,不同的返回值对于finally返回的Promise实例的状态的影响。...如果回调函数的返回值是一个状态为rejected的Promise实例,那么.then, .catch或.finally返回的Promise实例的状态就是rejected。...如果回调函数的返回值是一个还未决议的Promise实例p2,那么.then, .catch或.finally返回的Promise实例p1的状态取决于p2的决议结果。...如果回调函数中抛出了异常,那么.then, .catch或.finally返回的Promise实例的状态就是rejected,并且reason是所抛出异常的对象e。
在开发中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的。...jQuery开发团队就设计了deferred对象,来作为回调函数的解决方案。...; } }); $.ajax()操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR对象,你没法进行链式操作;如果高于1.5.0版本,返回的是deferred对象,可以进行链式操作...; }); 上述示例中,提及到了deferred.resolve()。说明其作用需要先说一下jQuery规定deferred对象的三种执行状态:未完成、已完成和已失败。...解决上述“全局变量”问题:我们使用deferred.promise() 其作用:在原来的deferred对象上返回Promise对象,后者只开放与改变执行状态无关的方法(比如done()方法和fail
#### 权限申请SW.register('sw.js') .then(reg=>{}) 它返回的是 Promise 对象。...; }) 它返回的是 Promise 对象。...在 `Web Worker` 中,我们可以使用` postMessage` 进行通信,那么在 SW(Service Worker)中同样是可以的。...@return: promise WebCaches.table('demo-v1').open() .then(cache=>{}) 添加行 向表中添加具体的缓存行,添加方式有三种: addRow...这里提供了一个工具函数 `clone` 用来生成可重复使用的对象。
,重学ES6+,前面我们介绍了promise,生成器和迭代器,async await,现在我们总结一下针对异步代码处理方案 业务场景 请求一个接口,拿到返回值,对返回值进行处理,当作第二个接口的请求参数...executor中 return new Promise((resolve, reject) => { // 模拟网络请求 setTimeout(() => { // 拿到请求的结果...方案四 Promise中then的返回值来解决回调问题 requestData("why").then(res => { return requestData(res + "aaa") }).then...try catch才能捕获到异常 业务使用 Promise + async/await async/await是基于generator的语法糖,返回的也是一个promise,所以返回值可以调用promise...可以梳理平常的业务代码 更容易理解拆分业务 ,而generator 适用于需要暂停的业务逻辑,promise 适用于 构建通用异步函数
(回调) # 2.QQ的离线发送文件。 以上是生活中的例子,那么我们接下来以代码为例子。...# 但回调函数不一定只用在异步任务里 # 回调可以用到同步任务里 # array.forEach(n=>console.log(n))就是同步回调 ---- 如何判断一个函数时异步还是同步 如果一个函数的返回值处于下面几种情况...// 返回了一个含有.then()方法的对象呗 // 那么再请问,如何得到这和个含有.then()的对象呢?...,搜索ajax找到jQuery.ajax,看看参数说明,然后直接看代码示例,看看jQuery的封装,就知道自己的封装有多么的辣鸡了。...封装的优点: 支持更多形式的参数 支持Promise 支持的功能超多 我们需要掌握jQuery.ajax嘛?
/ Promise的形式 $.get('url').success(function(rs) { rs = JSON.parse(rs); }) 不过jQuery中的Promise并不是完全按照...getContent(rs.user)这个promise对象,继续接下去的执行任务 除了直接返回这个新的promise对象,我们也可以直接返回一个数据,这个数据将会作为下一函数调用时的参数,且看例子:...或catch方法来监视log(6)的状态,所以仅仅输出的在log函数中执行的结果 Promise.resolve()方法 除了在实例化Promise构造函数内部使用resolve之外,我们还可以直接调用...= Promise.resolve($.get('url')); 前文说到jQuery的Promise实现方式并不是完全按照规范来着,通过Promise.resolve的包装,可以返回一个规范化的Promise...()方法 除了在实例化Promise构造函数内部使用reject之外,我们还可以直接调用reject方法 类似于Promise.resolve()中参数的多样化,且看以下几个栗子: Promise.resolve
领取专属 10元无门槛券
手把手带您无忧上云