js里的回调地狱是个极其蛋疼的事,promise能够比较好的解决方法,但他也有缺点,这里先谈他的基本用法。
若是咱们不用promise写异步操做的时候,假设咱们请求3个文件:ajax
1.txt;
2.txt;
3.txt
在js里咱们会这么写:promise
$.ajax({ url('./upload/1.txt'), success(data) { //do something $.ajax({ url('./upload/2.txt'), success(data) { //do something $.ajax({ url('./upload/3.txt'), success(data) { //do something }, error(err) { alert('出错了') } }) }, error(err) { alert('出错了') } }) }, error(err) { alert('出错了') } })
这也太恐怖了吧
promise解决的其实就是用同步的写法来写异步操做
promise里面有个all方法,里面放咱们要执行的异步操做,在全部操做完成后调用then方法,这个方法有两个参数resolve和reject,操做成功和操做失败。来看例子:异步
Promise.all([ $({url:'./upload/1.txt'}), $({url:'./upload/2.txt'}), $({url:'./upload/3.txt'}) ]).then(resolve=>{ //do something },reject=>{ alert('出错了') })
全部的异步操做成功会才会调用resolve,不然就调用reject。这个写法就舒服多了。
generator函数简单的来讲就是能够暂停目前在执行的函数,去执行其余的代码,何时你想继续执行了继续来调用就能够继续来执行了。
建立一个generator函数:函数
function *show(){ //this is a generator function }
没错,就是在函数名称前加了个*号,这里面有一个yeild值得咱们来讲说。
在建立完generator函数以后,咱们须要来执行他,和普通函数的执行不一样,generator函数是这样执行的:this
function *show(){ alert('do something'); yeild; alert('continue'); } let g1=show(); g1.next()//do something alert('do other');//do other g1.next()//continue
函数里面出现了一个yield,这个就是咱们从开始执行到暂停的地方,调用g1.next()就执行到这里,而后程序就从第一个g1.next()处开始执行alert('do other');执行完以后咱们在调用g1.next()就又回到show函数中从yeild处开始往下执行。
其中yeild还能够传参数:url
function *show(){ alert('do something'); yeild 5; } let a=g1.next();//a=5
也能够传参数进去:code
function *show(){ alert('do something'); let a=yeild; alert(a)//6 } g1.next();//do something g1.next(6)