可以通过Promise函数,实现一连串的业务组合。
then有两个参数,分别是两个function 按顺序对应上面的myResolve, myReject两个function
1.onFulfilled
2.OnRejected
- 参考:
- 1、Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)
- 2、Promise构造函数接收一个函数作为参数,该函数的两个参数分别是 resolve 和 reject
- 3、一个promise对象只能改变一次状态,成功或者失败后都会返回结果数据。
- 4、then 方法可以接收两个回调函数作为参数,第一个回调函数是Promise对象的状态改变为 resoved 是调用,第二个回调函数是 Promise 对象的状态变为 rejected 时调用。其中第二个参数可以省略。
- 5、catch 方法,该方法相当于最近的 then 方法的第二个参数,指向 reject 的回调函数,另一个作用是,在执行resolve回调函数时,如果出错,抛出异常,不会停止运行,而是进入catch 方法中。
function print(delay, message) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log(message);
resolve(message);
}, delay);
}).then(function(value) {
console.log(value);
return value;
}).then(function(value) {
console.log("value=" + value);
if(10/0) throw "happen error"
return value;
}).catch(function(err) {
console.log("err=" + err);
}).finally(function(value) {
// value没有传递到这里,所有 finally(function())无参
console.log("final value =" + value);
});
}
print(10, 'OK')
代码在线演示。http://jsfiddle.net/developerofbamboobook/ag6no21t/78/
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Promise</h2>
<p id="demo"></p>
<script>
function myDisplayer(some) {
document.getElementById("demo").innerHTML += some;
}
let myPromise = new Promise(function(myResolve, myReject) {
let x = 10;
if (x == 0) {
myResolve("OK");
} else {
myReject("Error");
}
});
//then有两个参数,分别是两个function 按顺序对应上面的myResolve, myReject两个function
1.onFulfilled
2.OnRejected
myPromise.then(
function(value) {
myDisplayer(value);
},
//Error 不再执行后面的then
function(error){
myDisplayer(error);
}
);
myPromise.then(
function(value){
myDisplayer(value);
});
</script>
</body>
</html>
async 和 await 搭配使用,等待异步的结果
function SicBo() {
return new Promise((resolve, reject) => {
console.log("开始摇 ")
setTimeout(() => {
let n = parseInt(Math.random() * 6 + 1, 10) //1~6
resolve(n)
}, 1000)
})
}
SicBo().then(
(n)=>{console.info("1秒前:"+n)},
//function(y){console.info('ss')}
);
async function Roll(){
let n = await SicBo() //不写括号就不会执行 new Promise
console.log('1秒后:'+n)
}
Roll() //记得要调用函数