Promise 处理异步问题

实际开发过程中经常会遇到异步的问题,比如:

       前端向后端发起请求request1,需要获得数据data1,发起请求request2同时需要请求参数data1,需要获得数据data2,然后紧接着需要利用data2进行某项计算。。。。理想状态下,按思路代码一路执行下来,没毛病

     但是!ajax是一个异步的操作,由于网络延迟,request2执行时很可能request1还没有返回data1,于是获取不到data1,request2失败,SO,data2也获取不到了。。。然后一路错下去,当request1返回data1时,程序已经一路崩下去无可挽回了

看一个demo:

function test(resolve, reject){
    let m = 22;;
    setTimeout(function(){
         m +=100;
         if(m<111){
            resolve(m)
        }else{
            reject(111);
        }
        }, 2000);
  console.log("哈哈1");     
}

var p = new Promise(test);
p.then(function(res){
    console.log("成功:",res);
});
p.catch(function(res){
    console.log("失败:",res);
})
console.log("哈哈2");

// 结果:
//——————————————————————————
// 哈哈1
// 哈哈2
// 失败: 111

       而一般方法是利用回调函数来解决异步问题,然而回调函数这个东西我就感觉思维有点不合正常人类逻辑咯,而且代码也比较繁琐。于是乎,引入Promise是个十分不错的选择。顾名思义,Promise即 “承诺” 的意思,既然是承诺,一诺千金那肯定是必须要做的。所以Promise(test)的含义就是承诺在未来的某个时间肯定会执行函数f

       而函数f需要有两个参数:resolve reject 。这两个参数都是函数。异步执行操作执行成功时调用resolve函数,失败时调用reject函数。(这两个函数是js引擎自带的不用自己定义哟)。而里面的参数,resolve的参数会传递给then的回调函数,reject的参数会传递给catch的回调函数然后对其进行进一步处理。

或许说到这里还是没有感觉Promise有什么牛逼的地方,那么,如果比我文章开头还要复杂点的有多个异步操作的问题呢?

// 0.5秒后返回input*input的计算结果:
function multiply(input) {
    return new Promise(function (resolve, reject) {
        console.log('calculating ' + input + ' x ' + input + '...');
        setTimeout(resolve, 500, input * input);
    });
}

// 3秒后返回input+input的计算结果:
function add(input) {
    return new Promise(function (resolve, reject) {
        console.log('calculating ' + input + ' + ' + input + '...');
        setTimeout(resolve, 3000, input + input);
    });
}

var p = new Promise(function (resolve, reject) {
    console.log('start new Promise...');
    resolve(123);
});

p.then(multiply)
 .then(add)
 .then(multiply)
 .then(add)
 .then(function (result) {
    console.log('Got value: ' + result);
});

如上述例子,当多个异步问题是可以采取 p.then().then()..........这样的写法,当一个then执行完且执行成功时才会执行下一个then,失败则停止执行

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值