promise和generator

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)
相关文章
相关标签/搜索