美文网首页
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