promise的链式调用

promise的链式调用

每次then都是对上一个promise进行处理。

如下例,第一个then是对p1的期约进入“允许“状态时执行,而如果没有提供处理程序,默认情况下会按照“兑现“

状态执行(如第二个then)

let p1 = new Promise((resolve, reject) => {
	resolve("fulfilled");
	})
    .then(
        value => {
        	return "good";
        },
        reason => console.log("erorr" + reason)
    )
    .then(
        value => {
            console.log("成功:" + value);
        },
        reason => console.log("error" + reason)
	);

//成功good

注意虽然是对上一个promise处理,但是promise的链式处理是一步接着一步的,每次then都是有联系的。

let p1 = new Promise((resolve, reject) => {
	reject("fail");
	//   resolve("fulfilled");
	})
    .then(
        value => {
        	return "good";
        },
        reason => console.log("erorr" + reason)
    )
    .then(
        value => {
            console.log("成功:" + value);
        },
        reason => console.log("error" + reason)
	);

//erorrfail
//成功:undefined

每次new新创建的promise对象,默认状态为pending,需要通过调用resolve()和reject()改变当前promise对象的状态,不然无法执行then方法里的内容。而在then方法中返回的promise实例的状态为fulfilled。

如下例,通过连缀调用then构成”期约连锁”,但这样的实现最终执行了一连串同步任务(相当于所有的代码都在一个then中)。

let p = new Promise((resolve, reject) => {
        console.log('first');
    //若把resolve()删除,则不会执行后面的三个then
        resolve();
    }).then(()=>{
        setTimeout(()=>{console.log('second')},1200);
    }).then(()=>{
        setTimeout(()=>{console.log('thirt')},1000);
    }).then(()=>{
        setTimeout(()=>{console.log('four')},800);
    });

//first
//four
//thirt
//second

要真正执行异步任务,要让每个执行器都返回一个期约实例,每次通过resolve()或reject()改变当前promise对象的状态,这样就可以让每个后续期约都等待上一个的期约。

let p = new Promise((resolve, reject) => {
        console.log('first');
        resolve();
    }).then(()=>{
        return new Promise((resolve, reject)=>{
            console.log('second');
            setTimeout(resolve,1200);
        })
    }).then(()=>{
        return new Promise((resolve, reject)=>{
            console.log('thirt');
            setTimeout(resolve,1000);
        })
    }).then(()=>{
       return new Promise((resolve, reject)=>{
            console.log('four');
            setTimeout(resolve,800);
        })
    });
//first
//second
//third
//four
posted @ 2021-02-05 23:05  Hhhighway  阅读(847)  评论(0编辑  收藏  举报