Javascript Promise(function(a,b))实现异步操作链

可以通过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() //记得要调用函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值