美文网首页
js Promise

js Promise

作者: BestFei | 来源:发表于2019-10-23 16:08 被阅读0次

    一、Promise
    1、Promise对象代表一个异步操作,有三种状态,pending(进行中)、fulfilled(已成功)、rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态,这也是promise这个名字的由来“承若”。

    2、一旦状态改变就不会再变,任何时候都可以得到这个结果。
    promise对象的状态改变,只有两种可能:从pending变为fulfilled,从pending变为rejected。
    这时就称为resolved(已定型)。
    如果改变已经发生了,你再对promise对象添加回调函数,也会立即得到这个结果。
    这与事件(event)完全不同,事件的特点是:如果你错过了它,再去监听是得不到结果的。

    3、promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致。

    4、then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。

    二、Promise的语法
    MDN web docs 官方的语法

    new Promise( function(resolve, reject) {...} /* executor */  );
    

    举例

    var isOpen = true;
    //创建一个Promise对象名为 buyCloth
    //resolve 和 reject 参数是函数
    //当承诺实现了的时候,就会调用resolve函数,然后对应的promise的状态就变成fulfilled;
    //当承诺没有实现的时候,就会调用reject函数,其状态变成了rejected
    var buyCloth = new Promise(function(resolve,reject){
        if(isOpen){
            var cloth = {
                color:'red',
                price:'$120'
            };
            resolve(cloth);
        }else{
            var err = new Error("the shop is closed");
            reject(err);
        }
    });
    
    
    var testPromise = function(){
        buyCloth.then(function(fulfilled){
            console.log(fulfilled);
        }).catch(function(rejected){
            console.log(rejected.message);
        });
    }
    

    我们定义一个 testPromise 函数来调用 promise,
    .then() 和.catch() 函数来处理 promise 返回的结果。

    1、.then()
    有两个参数:onFulfilled 和 onRejected
    onFulfilled当然是Promise 实现的时候调用,onRejected就是Promise被拒绝的时候调用的。
    如果传入的 onFulfilled 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数

    2、.catch()
    是当promise没有实现的时候,状态为rejected时被使用。请求失败则调用error函数。

    .then() 里面的函数有一个fulfilled的参数,这个参数的值就是promise实现后调用resolve()所返回的值,在这里就是 cloth ;
    同理.catch() 里面的一个rejected参数的值就是promise没有实现而调用reject()所返回的错误信息值在这个例子就是 err 。

    三、完整代码
    1、新建一个b.js文件
    testPromise() 无参调用Promise方法
    testPromise2(boolen isOpen) 传参调用Promise方法

    function alerTest(){
      alert("test");
    }
    
    
    function testSetTimeout(){
        var time = 0;
        for (var i = 0; i <= 3; i++) {
            console.log(i+" begin");
                time = new Date().getTime();
            setTimeout(function(){
                console.log(new Date().getTime()-time);
                console.log("hi");
            },600);
            console.log(i+" end");
        }
    }
    
    
    
    
    var isOpen = true;
    //创建一个Promise对象名为 buyCloth
    //resolve 和 reject 参数是函数
    //当承诺实现了的时候,就会调用resolve函数,然后对应的promise的状态就变成fulfilled;
    //当承诺没有实现的时候,就会调用reject函数,其状态变成了rejected
    var buyCloth = new Promise(function(resolve,reject){
        if(isOpen){
            var cloth = {
                color:'red',
                price:'$120'
            };
            resolve(cloth);
        }else{
            var err = new Error("the shop is closed");
            reject(err);
        }
    });
    
    
    var testPromise = function(){
        buyCloth.then(function(fulfilled){
            console.log(fulfilled);
        }).catch(function(rejected){
            console.log(rejected.message);
        });
    }
    
    
    //通过前端调用把 isShopOpen 值传入
    var buyCloth2 = function(isShopOpen){
        //then必须返回一个promise
        return new Promise(function(resolve,reject){
            if(isShopOpen){
                var cloth = {
                    color:'red',
                    price:'$120'
                };
                resolve(cloth);
            }else{
                var err = new Error("the shop is closed");
                reject(err);
            }
        });
    }
    
    var testPromise2 = function(isOpen){
        buyCloth2(isOpen).then(function(fulfilled){
            console.log(fulfilled);
        }).catch(function(rejected){
            console.log(rejected.message);
        });
    }
    
    

    2、同一目录下新建一个 test.html
    我们定义三个按钮去调用Promise
    testPromise(),testPromise2(true),testPromise2(false)

    <!DOCTYPE html>
    <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <script src="b.js"></script>
    </head>
    <body>
        <p>
        js的单线程机制,当程序执行到setTimeout时,会跳过setTimeout需要等候的时间,执行后面的程序,
        到了相应的时间后,js才把setTimeout的程序放到队列中.
        至于会不会在准确的时间去执行setTimeout,这是说不准的,因为这要等之前就正在执行的程序执行完才轮到setTimeout的执行,
        所以一般情况下,setTimeout的程序一般会在所设定的时间之后才执行。
        </p>
    
        <button type="button" onclick='testSetTimeout()'>testSetTimeout</button>
    
        <p>Promise</p>
        <button type="button" onclick='testPromise()'>testPromise</button>
        <button type="button" onclick='testPromise2(true)'>testPromiseYes</button>
        <button type="button" onclick='testPromise2(false)'>testPromiseNo</button>
    
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:js Promise

          本文链接:https://www.haomeiwen.com/subject/zbdkvctx.html