Promise:一种解决回调问题的技术 首先我们要理解同步与异步的含义: 同步:函数在执行时会阻塞调用者,并在执行完毕后返回结果。 异步:函数在执行时不会阻塞调用者,但是一旦执行完毕就会返回结果。...next函数被调用后,生成器就开始执行代码,当代码直行道yield关键字时,就会生成一个中间结果(生成值序列中的一项),然后返回一个新对象,其中封装了结果值(value)和一个指示完成的指示器(done...完成:在生成器执行期间,如果代码执行到return语句,或者全部代码执行完,生成器就会进入完成状态。...Generator和Promise结合 将生成器和Promise结合,能实现更加优雅的代码。例如:我们可以把异步任务放在生成器中,然后执行生成器函数。...:帮助处理异步代码 回调函数:在Promise对象上注册成功和失败的回调函数 箭头函数:适合用在回调函数上 闭包:迭代器在async函数内被创建,在promise的回调函数内通过闭包获取该迭代器 generator
首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。 下面是异步加载图片的例子。...需要注意的是,在getJSON内部,resolve函数和reject函数调用时,都带有参数。 如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。...第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。 采用链式的then,可以指定一组按照次序调用的回调函数。...这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。 这个脚本放在服务器执行,退出码就是0(即表示执行成功)。
除了善用设计模式提高代码优雅程度外,es6原生提供的Promise对象也为异步函数回调提供的比较优雅的解决方案。它把原来的嵌套回调变成了级联调用,很好的解决回调地狱的问题。...需要注意的是,在getJSON内部,resolve函数和reject函数调用时,都带有参数。 如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。...下面代码中,调用resolve(10)以后,后面的console.log(2)还是会执行,并且会首先打印出来。...这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。..., error); 6}); 上面代码中,getJSON方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected
使用async函数相比于生成器函数的改进主要在于前者具备内置执行器,即直接调用async函数就能执行完整个函数,就像普通函数调用那样,而无需像生成器函数通过调用返回的迭代器的next()方法来手动执行后续代码...async函数基本用法 当async函数执行时,一旦遇到await关键字就会先返回,等到异步操作完成,然后再接着执行函数体后面的代码。...} ) .catch( function ( err ) { console.log( err ); // Error: errmsg } ) async函数返回的Promise对象必须等到内部所有...await命令后的异步操作执行完才会执行then方法指定的回调函数,除非遇到return语句或抛出错误。...,如果失败会被catch语句捕获并进入下一个循环。
所有环境中的共同点是一个称为事件循环的内置机制,它处理程序的多个块在一段时间内通过调用调用JS引擎的执行。 这意味着JS引擎只是任意JS代码的按需执行环境,是宿主环境处理事件运行及结果。...这样的迭代在事件循环中称为(tick)标记,每个事件只是一个函数回调。 ? 让我们“执行”这段代码,看看会发生什么: 1.初始化状态都为空,浏览器控制台是空的的,调用堆栈也是空的 ?...执行 console.log('Bye') ? 10. console.log('Bye') 从调用调用堆栈移除 ? 11. 至少在5秒之后,计时器完成并将cb1回调推到回调队列。 ? 12....有不少的文章和教程上开始使用异步JavaScript代码,建议用setTimeout(回调,0),现在你知道事件循环和setTimeout是如何工作的:调用setTimeout 0毫秒作为第二个参数只是推迟回调将它放到回调队列中...从概念上讲,这类似于在代码中表示长时间运行或无限循环(如while (true) ..)。
从前面几篇文中的知识我们可以得知,想要确保某代码在谁谁之后执行,我们可以利用函数调用栈,将想要执行的代码放入回调函数中。...首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。 下面是异步加载图片的例子。...需要注意的是,在getJSON内部,resolve函数和reject函数调用时,都带有参数。 如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。...第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。 采用链式的then,可以指定一组按照次序调用的回调函数。
不会在函数调用后被清除 可以通过下面的代码来帮助理解上面所说的: function addCounter() { let counter = 0 const myFunction = function...(也所以this对象指向新对象) 执行构造函数内部的代码,将属性添加给obj中的this对象。 返回新对象obj。...传统的回调有五大信任问题: 调用回调过早 调用回调过晚(或者没有被调用) 调用回调次数过多或过少 未能传递所需的环境和参数 涂掉可能出现的错误和异常 3. Promise 如何使用?...getJSON('/posts.json').then(function(posts) { // ... }).catch(function(error) { // 处理 getJSON 和 前一个回调函数运行时发生的错误..., error); }); 上面代码中,getJSON方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected
首先是可迭代对象:这些是可以被迭代的类型,如 Array、Set 和 Map。其次,是执行迭代的迭代器对象本身。第三,是保存迭代每一步结果的迭代结果对象。...在上述代码中,一个假设的checkForUpdates()函数将在setTimeout()调用后的 60,000 毫秒(1 分钟)后被调用。...如果用户点击或触摸 Web 页面的特定元素,那么浏览器将调用我们的applyUpdate()回调函数,传递一个包含有关事件的详细信息(如时间和鼠标指针坐标)的对象。...当getJSON()返回时,回调函数会异步调用,因此它也是异步的,不能有意义地抛出异常(因为没有代码在调用堆栈上处理它)。...(url1); let value2 = await getJSON(url2); 这段代码的问题在于它是不必要的顺序执行:第二个 URL 的获取将等到第一个 URL 的获取完成后才开始。
默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。 注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。...注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。 url 类型:String 默认值: 当前页地址。发送请求的地址。...这主要用来让 jQuery 生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存 GET 请求的时候,指定这个回调函数名。...脚本,下载完成后,自动执行。...console.log( jqxhr.status ); // 200 console.log( "Load was performed." ); }); load()方法 从后台下载html内容,下载完成后替换到选择元素的内部
第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。...上面代码中,getJSON方法返回一个 Promise 对象;如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数,处理这个错误。...从上面的代码中我们还可以看出一个点,就是如果reject和resolve方法带有参数,则会将参数传递后相应的回调函数中。...调用完成以后,后面的代码依然会执行,只不过再抛出错误,不会被捕获,等于没有抛出,后面的代码执行对于传入的参数没有任何影响。因为 Promise的状态一旦改变,就永久保持该状态,不会再变了。...,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise. resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。
在上面的代码中getJSON调用会立即返回,不会阻塞主线程运行,数据获取成功之后,会调用updateUI,如果失败,则调用showError。...callbacks的另一个问题是“控制反转”,当你的代码调用另一个函数,如果这个函数并不是你编写的,你就失去了控制权。万一你调用的回调函数执行了非常耗时的操作,但又没有考虑异步,你也无法控制。...如果异步请求已成功完成,则Promise将变为fulfilled状态。如果异步请求失败,则Promise将变为rejected状态。是不是和前面用于解决餐厅等位问题的蜂鸣器很像?...该对象可以调用then和catch这两个方法,这两个方法都接受一个回调函数作为参数。当Promise的状态变为fulfilled时,传递给.then的函数将被调用。...这意味着在getWeather内部,如果我们调用自己的resolve方法,则可以将天气和用户传递给它。这样,链中的第二个.then方法将同时接收用户和天气作为参数。
Promise的缺点: 无法取消Promise,一旦创建就会立即执行。 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...调用Promise Promise实例生成后,可以用then方法分别指定resolved状态和rejected状态的回调函数。...// 第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数,回调函数可以采用箭头函数形式,更加简洁 getJSON("/posts.json").then(function(json){...和 前一个回调函数运行时发生的错误 }); 如果没有使用catch()方法指定错误处理的回调函数,Promise对象抛出的错误不会传递到外层代码,即不会有任何反应。...promise.catch()捕获所有同步和异步的错误。
注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。...html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。 script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。...注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。 json:返回JSON数据。 jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?...为正确的函数名,以执行回调函数。...(11)complete : 类型: Function( jqXHR jqXHR, String textStatus ) 请求完成后回调函数 (请求success 和 error之后均调用)。
Generator 函数helloWorldGenerator,它内部有两个yield表达式(hello和world),即该函数有三个状态:hello,world 和 return 语句(结束执行)。...不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(Iterator Object)。...也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止。...首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。 采用链式的then,可以指定一组按照次序调用的回调函数。
callback=X”这种格式,让程序执行回调函数X。...注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。...complete Function 请求完成后回调函数 (请求成功或失败时均调用)。 参数: XMLHttpRequest 对象,成功信息字符串。...使用 JSONP 形式调用函数时, 如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。...你无法同时执行success和error两个回调函数 ajaxError 全局事件全局的发生错误时触发 complete (局部事件) 不管你请求成功还是失败,即便是同步请求,你都能在请求完成时触发这个事件
注意Promise对象一旦新建就会立即执行,并且无法中途取消;并且如果不设置回调函数,Promise内部抛出的错误,也不会反应到外部;当处于pending状态时,无法得知目前进展到哪一阶段(刚开始还是即将完成...本行代码处于同步执行流中。 // 同步执行流2 // 我是被成功异步读取的txt文本数据 Promise构造函数接收一个函数作为参数,这个函数又有两个参数,分别是resolve和reject。...Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。...然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。 then方法可以接受两个回调函数作为参数。...第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。
api=jquery // 注意:在JS代码中,为保证 JS代码能够正常运行,需要在HTML代码加载完毕后,再执行JS代码。...dataFilter:在请求成功之后调用。传入返回数据以及“dataType”参数的值。并且必须返回(经处理的)数据传递给success回调函数。...success:当请求之后调用。传入返回后的数据,以及包含成功代码的字符串。 complete:当请求完成之后调用这个函数,无论成功或失败。...async:默认为true,所有请求均为异步请求。当设置为false时,同步请求将锁住浏览器,其他操作必须等待请求完成之后。...XMLHttpRequest 对象和设置作为参数传递给回调函数。
8",(error1, data1)=>{ if(error1){ //失败的时候做的事情 reject(error1); // 调用后面...p1.then的第二个函数 } //读取完之后做的事情 resolve(data1); // 调用后面p1.then的第二个函数 }) })...Promise的then链式调用的特点 链式调用的特点: 第一个then执行完会执行第二个then then里面的函数的返回值,会被下一个then的形参接收 如果返回的是一个promise对象,下一个then...的形参接收到的不是这个promise对象,而是这个promise对象内部调用resolve时候的实际参数 const fs = require("fs"); const path = require("...对象的实例,状态为rejected,回调函数会立即执行。