​Promise1

简介: ​Promise

Promise 

Promise是一个构造函数,自己身上有allrejectresolve这几个眼熟的方法,原型上有thencatch等同样很眼熟的方法。

var p = new Promise(function(resolve, reject){
    //做一些异步操作
    setTimeout(function(){
        console.log('执行完成');
        resolve('随便什么数据');
    }, 2000);
});

Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolvereject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用成功失败来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiledreject是将Promise的状态置为rejected

我们用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数,如

function runAsync(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('执行完成');
            resolve('随便什么数据');
        }, 2000);
    });
    return p;            
}
runAsync()

在我们包装好的函数最后,会returnPromise对象,也就是说,执行这个函数我们得到了一个Promise对象。还记得Promise对象上有thencatch

runAsync().then(function(data){
    console.log(data);
    //后面可以用传过来的数据做些其他操作
    //......
});

runAsync()的返回上直接调用then方法,then接收一个参数,是函数,并且会拿到我们在runAsync中调用resolve时传的的参数。运行这段代码,会在2秒后输出执行完成,紧接着输出随便什么数据”。

链式操作的用法

function runAsync1(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务1执行完成');
            resolve('随便什么数据1');
        }, 1000);
    });
    return p;            
}
function runAsync2(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务2执行完成');
            resolve('随便什么数据2');
        }, 2000);
    });
    return p;            
}
function runAsync3(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务3执行完成');
            resolve('随便什么数据3');
        }, 2000);
    });
    return p;            
}

调用:

runAsync1()
.then(function(data){
    console.log(data);
    return runAsync2();
})
.then(function(data){
    console.log(data);
    return runAsync3();
})
.then(function(data){
    console.log(data);
});

异步任务1执行完成

随便什么数据1

异步任务2执行完成

随便什么数据2

异步任务3执行完成

随便什么数据3

then方法中,你也可以直接return数据而不是Promise对象,在后面的then中就可以接收到数据了,比如我们把上面的代码修改成这样:

runAsync1()
.then(function(data){
    console.log(data);
    return runAsync2();
})
.then(function(data){
    console.log(data);
    return '直接返回数据';  //这里直接返回数据
})
.then(function(data){
    console.log(data);
});

// 输出结果

异步任务1执行完成

随便什么数据1

异步任务2执行完成

随便什么数据2

直接返回数据

reject的用法

运行getNumber并且在then中传了两个参数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调

function getNumber(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            var num = Math.ceil(Math.random()*10); //生成1-10的随机数
            if(num<=5){
                resolve(num);
            }
            else{
                reject('数字太大了');
            }
        }, 2000);
    });
    return p;            
}
 // then可以接受两个回调 (成功 失败)
getNumber()
.then(
    function(data){
        console.log('resolved');
        console.log(data);
    },
    function(reason, data){
        console.log('rejected');
        console.log(reason);
    }
);

catch的用法

Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?其实它和then的第二个参数一样,用来指定reject的回调,用法是这样:

getNumber()
.then(function(data){
    console.log('resolved');
    console.log(data);
})
.catch(function(reason){
    console.log('rejected');
    console.log(reason);
});


相关文章
|
2天前
|
前端开发
Promise.allSettled()方法和Promise.race()方法有什么区别?
`Promise.allSettled()` 提供了一种更全面、更详细的方式来处理多个 `Promise`,而 `Promise.race()` 则更强调速度和竞争。我们需要根据具体的需求来选择使用哪种方法。
|
7月前
|
前端开发
promise和async的区别是什么?
promise和async的区别是什么?
86 1
|
前端开发
promise ,async/await的基础用法
promise ,async/await的基础用法
|
前端开发
前端学习案例23-promise.all和promise.race
前端学习案例23-promise.all和promise.race
73 0
前端学习案例23-promise.all和promise.race
|
前端开发
前端学习案例24-promise.all和promise.race之2
前端学习案例24-promise.all和promise.race之2
85 0
前端学习案例24-promise.all和promise.race之2
|
前端开发
前端学习案例8-promise-aysnc,await之3
前端学习案例8-promise-aysnc,await之3
74 0
前端学习案例8-promise-aysnc,await之3
|
前端开发
前端学习案例10-promise-aysnc,await之6
前端学习案例10-promise-aysnc,await之6
56 0
前端学习案例10-promise-aysnc,await之6
|
前端开发
前端学习案例6-promise-aysnc,await之1
前端学习案例6-promise-aysnc,await之1
81 0
前端学习案例6-promise-aysnc,await之1
|
前端开发
前端学习案例11-promise-aysnc,await之7
前端学习案例11-promise-aysnc,await之7
72 0
前端学习案例11-promise-aysnc,await之7