您可以通过在调用生成器的next()方法时传递这些值来向正在运行的生成器传递值。 除了使用next()向生成器提供输入外,还可以通过调用其return()和throw()方法来更改生成器内部的控制流。...因为计算是在 Promise 对象返回给我们后执行的,所以传统上计算无法返回一个值或抛出我们可以捕获的异常。我们传递给then()的函数提供了替代方案。...如果您在 Promise 链中添加一个.finally()调用,那么您传递给.finally()的回调将在您调用它的 Promise 完成时被调用。...但是,如果您需要在任一情况下运行某种清理代码(例如关闭打开的文件或网络连接),则.finally()回调是执行此操作的理想方式。...异步迭代器提供了一种替代 Node 中“data”事件的方式,并可用于表示客户端 JavaScript 中用户输入事件的流。 ¹ XMLHttpRequest 类与 XML 无关。
,先只需要反引号代替单引号或双引号即可: const module_string = `dadaqianduan` 它们之所以独特是因为它们提供了很多用引号构建的普通字符串不具备的功能: 提供了定义多行字符串的语法...; 提供了一种简单的方法来插值字符串中的变量和表达式 允许您使用模板标签创建DSL(领域特定的语言) 使用多行字符串 在es6之前的版本: // 要创建跨越两行的字符串,必须\在行尾使用字符 const...image 使用trim()方法,可以消除第一个字符之前的任何空格 插补:模板文字提供了一种将变量和表达式插入字符串的简便的方法 const da = `dadaqianduan ${mydada}`...,会把iterable里的第一个触发失败的promise对象的错误信息作为它的失败信息 场景,多用于处理多个promise对象的状态集合 Promise.any(iterable) 接收一个Promise...示例: 想象一下,您已经17岁了,即将满18岁。并且您希望您的程序在打开时自动向您祝贺。为此,您可以使用代理。
,先只需要反引号代替单引号或双引号即可: const module_string = `dadaqianduan` 它们之所以独特是因为它们提供了很多用引号构建的普通字符串不具备的功能: 提供了定义多行字符串的语法...; 提供了一种简单的方法来插值字符串中的变量和表达式 允许您使用模板标签创建DSL(领域特定的语言) 使用多行字符串 在es6之前的版本: // 要创建跨越两行的字符串,必须\在行尾使用字符 const...: const da = `First Second` 使用trim()方法,可以消除第一个字符之前的任何空格 插补:模板文字提供了一种将变量和表达式插入字符串的简便的方法 const...,会把iterable里的第一个触发失败的promise对象的错误信息作为它的失败信息 场景,多用于处理多个promise对象的状态集合 Promise.any(iterable) 接收一个Promise...示例: 想象一下,您已经17岁了,即将满18岁。并且您希望您的程序在打开时自动向您祝贺。为此,您可以使用代理。
一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。如果该参数的值为 null或 undefined,则表示不需要传入任何参数。...手写 Promise 15. 手写 Promise.all 「语法」 Promise.all(iterable); iterable:一个可迭代对象,如 Array 或 String。...手写 Promise.race 「语法」 Promise.race(iterable); iterable:可迭代对象,类似Array 返回值:一个「待定的」 Promise只要给定的迭代中的一个promise...手写 Promise.any 「语法」 Promise.any(iterable); iterable:一个可迭代的对象, 例如 Array。...value(或 reason )反映了每个 promise 决议(或拒绝)的值。
扩展篇 数组的扩展 解构赋值 “ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)” 作用:可以快速取得数组或对象当中的元素或属性,而无需使用...():使用回调函数遍历每个成员 Map Map 是可以用非字符串当作键的键值对数据结构,类似于对象 Object Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。...Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。...lterator和for...of循环 Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是 ES6 创造了一种新的遍历命令...实际上,这提供了一种简便机制,可以将任何部署了 Iterator 接口的数据结构,转为数组。也就是说,只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。
Rx有数据产生的源头和严格意义的数据消费者,数据可以在中间的操作符里被处理,比如说做过滤,做合并,做节流,变换成新的数据源头等等,可以把它想象成一个完整的数据链,有头也有尾,到了最终消费者那边这个数据流就算到底...Promise需要调用then或catch才能够执行,catch是then的另一种形式,调用then或者catch之后如果返回一个新的Promise,新的Promise又可以被调用,因此可以做成无限的then...observable被订阅后并不是返回新的observable,而是返回一个subsciber,这样可以取消订阅,但是也导致了链式断裂,所以不能像Promise一样组成无线then链。...resolved,那么它就不可能再产生内容了,所以这个promise已经不是活动性的了。...其次是可能需要重试的场景,由于Rx有retry或者repeat这种从源头开始的运算符,我们可以用它来执行比如“出错后重试三次”之类动作,而Promise就需要你递归处理了,破坏了then的链式。
& ADT | Promise 和 ADT 的共通性 Promise 和上方的一个 ADT: Validation 很是相似, 可以看到 Promise 有一些 ADT 的特性 Identity...的行为很相似 Async Iteration | 异步迭代 假设有 A,B,C 三个 Promise 需要按照顺序依次执行....关于 Iterables 和 Iterator Protocol: Iterables 是一个可以被枚举,遍历及循环的对象 一般需要一个 Symbol.iterator 元素来决定遍历的细节....#val) : undefined; } } /* 第一个元素和 Success 的情况无关可以忽略 */ const [, right] = Success.of(2); right.isSuccess.../obUtil.js' /* 这个地方需要注意,这里扩展了原生的方法, 最好在方法里面添加一些判断,以防止未来原生方法里面出现一些变化, 比如同名方法等 */ Object.assign(Observable.prototype
一、Promise Promise是一个对象,代表了未来某个将要发生的事件(,这个事件通常是一个异步操作) 有了Promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称...Symbol 值 除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。...这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,来处理所有不同的数据结构。...,done: false和value: undefined属性都是可以省略的,因此上面的makeIterator函数可以简写成下面的形式。...接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。
二、报错信息解析 “Uncaught TypeError: XYZ is not iterable” 错误信息可以拆解为以下几个部分: Uncaught TypeError: 这表示一个未被捕获的类型错误...类型错误通常意味着代码试图执行一个不合法的操作,比如对非可迭代对象进行迭代。 XYZ is not iterable: 这里的 ‘XYZ’ 是具体的变量或标识符名称。...TypeError: promise is not iterable 在这个例子中,Promise.all 需要一个可迭代对象,而不是一个单独的 Promise 对象。...在 Promise.all 中传递可迭代对象 确保传递给 Promise.all 的参数是一个包含 Promise 对象的数组或其他可迭代对象。...以下几点是需要特别注意的: 使用可迭代对象:在 for...of 循环和扩展运算符中,确保使用的对象是可迭代的。
Promise是这样一个对象,对于任意的异步操作,它提供了一组固定的API,来操作这个结果。我们先看一段代码: ?...比如你有一个处理,需要依赖多个数据源,他们或同步(数据已经在内存中直接可读),或异步(数据需要从数据库或者文件系统读取,甚至来自第三方API),正常来说似乎很难被抽象成一个数据结构。...第一,一个Promise只能resolve单个数据,对应于同步处理里的单值数据;如果要处理异步场景下的 "array",那么,Observable是更好的方式。 ?...第二,Promise的API设计感觉有些缺陷,并非lazy(可能是历史原因,也可能考虑到API友好程度),一旦启动,不可终止。如果你需要处理可终止的异步操作,那么,也需要使用Observable。...(forEach)才会求值,而且,Observable提供了cancel的API: ?
在JavaScript中,您可以在Array中找到这些operator。 RxJS遵循JavaScript约定,因此您会发现以下运算符的语法与数组运算符的语法几乎相同。...被封装之后的Observables 当您使用包含不提供取消的外部API的Observable时,Observable仍会在取消时停止发出通知,但基础API不一定会被取消。...例如,如果您正在使用封装Promise的Observable,则Observable将在取消时停止发出,但不会取消基础Promise。...Rx.Observable.from 默认行为:同步 由于您在应用程序中使用的许多数据源都来自数组或迭代器,因此有一个运算符可以从中创建Observable。...在下一章中,我们将继续探索Observable序列,这次我们将介绍更高级的运算符,它们允许您控制程序中的流和数据,用之前无法想象的代码!
这里可以理解为await后面的语句相当于放到了new Promise中,下一行及之后的语句相当于放在Promise.then中。...事件流事件流是网页元素接收事件的顺序,"DOM2级事件"规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。首先发生的事件捕获,为截获事件提供机会。然后是实际的目标接受事件。...解析:parent.show(),可以直接获得所需的值,没啥好说的;child1.show(),Child的构造函数原本是指向Child的,题目显式将Child类的原型对象指向了Parent类的一个实例...在这道题中,错误直接被then的第二个参数捕获了,所以就不会被catch捕获了,输出结果为:error err!!!'...实现Promise.any = function(promises) { return new Promise((resolve, reject) => { if(Array.isArray
我将给您一个简短的解释,同时试图揭开这些行为的神秘面纱,并提供一些参考资料。...问题1: undefined 解析: 使用 var关键字声明的变量在JavaScript中会被提升,并在内存中分配值 undefined。但初始化恰发生在你给变量赋值的地方。...解析: let和 const声明可以让变量在其作用域上受限于它所使用的块、语句或表达式。与 var不同的是,这些变量没有被提升,并且有一个所谓的暂时死区(TDZ)。...---- 问题6 : 会导致TypeError错误 解析: 展开语法 和 for-of 语句遍历 iterable对象定义要遍历的数据。 Array 或 Map 是具有默认迭代行为的内置迭代器。...对象不是可迭代的,但是可以通过使用iterable和iterator协议使它们可迭代。
简介 ES6引入了一个全新的对象Promise,用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。Promise最直接的好处就是链式调用,另外在错误捕获上也很方便。...用同步的写法解决异步问题,代码直观,易于理解维护,解决了回调地狱的问题。关于Promise的详细讲解和更多用例我会开专门文章讨论。这里我们主要看一下Promise及其原型的属性和方法。 2....它们是两个函数,由 JavaScript 引擎提供,不用自己部署。 then方法可以接受两个回调函数作为参数。...构造函数的原型,可以为所有 Promise 类型的对象添加属性。...Promise.race(iterable) 当iterable参数里的任意一个子promise被成功或失败后,父promise马上也会用子promise的成功返回值或失败详情作为参数调用父promise
它提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。..., value: undefined } 一个迭代器对象 ,知道如何每次访问集合中的一项, 并记录它的当前在序列中所在的位置。...在 JavaScript 中迭代器是一个对象,它提供了一个 next() 方法,返回序列中的下一项。这个方法返回包含 done 和 value 两个属性的对象。...Observables 作为被观察者,是一个值或事件的流集合;而 Observer 则作为观察者,根据 Observables 进行处理。...一个普通的 JavaScript 对象只是一个开始,在 RxJS 5 里面,为开发者提供了一些保障机制,来保证一个更安全的观察者。
对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性。...实现Promise.all ❝Promise.all() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise...这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。...实现Promise.race ❝「Promise.race(iterable)」 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。...插入排序 // 插入排序 /** * 记住你是怎么打牌的就知道插入排序怎么实现了 * 1. 首先有一个有序的序列,可以认为第一个元素就是已排序的序列 * 2.
一个应用应该只包含一个状态树,为了让state树的不同部分去响应action,可能需要使用combineReducers()方法将多个reducers组合成一个reducer。...初始的state,可以由服务端返回,也可以是本地的会话保存。...通过中间件的拓展,action可以是promise、函数,但最终传递给底层的依然是纯对象。 195行处可以看到执行reducer来计算得出新的currentState并覆盖之前的值。...__proto__ === null; // true 而Array、RegExp的实例相对于纯对象,所处原型链的位置相对较低,所以知道了这一点,那上边的函数就好理解了。 [].__proto__....__proto__ === null; //true //或 Array.prototype.__proto__.__proto__ === null; RegExp.prototype.
() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 输入的所有promise的resolve...(iterable)方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。...参数 iterable 是一个可迭代的对象,例如Array,其中每个成员都是Promise。对于每个结果对象,都有一个 status 字符串。...value(或 reason )反映了每个 promise 决议(或拒绝)的值。...(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。...状态的改变是通过 resolve() 和 reject() 函数来实现的,可以在异步操作结束后调用这两个函数改变 Promise 实例的状态,它的原型上定义了一个 then 方法,使用这个 then 方法可以为两个状态的改变注册回调函数...1 的位置。...白屏的定义有多种。可以认为“没有任何内容”是白屏,可以认为“网络或服务异常”是白屏,可以认为“数据加载中”是白屏,可以认为“图片加载不出来”是白屏。场景不同,白屏的计算方式就不相同。...通过 标签指向一个需要访问的地址并提供一个回调函数来接收数据当需要通讯时。 <script src="http://domain/api?
领取专属 10元无门槛券
手把手带您无忧上云