Promise例子

前言:我看过沙漠下暴雨,看过大海亲吻鲨鱼,看过黄昏追逐黎明,没看过"你";网上对于Promise的解释的文章很多,不过茫茫“文”海中,要找一个讲得好的,太难,而且还要找到一个自己这种水平能看懂的例子,更难,所以需要多方查证,然后自己总结一个适合自己能力水平看得懂的文章才行。(领悟出一个道理:打铁还需自身硬)


(好文章还是很多,但是我这边是带着完成一个功能的目的去学习知识的)
https://segmentfault.com/a/1190000002928371 这一篇公认的基础篇,对于快速入门来说很好,方便学习,例子也很简单易懂
http://www.cnblogs.com/huansky/p/5676978.html  这一篇是我觉得API介绍得很全的一篇,例子也很好
http://www.imooc.com/article/3627 这一篇不得不说是一个进阶篇,对于有一定的基础的人去学习这个收获肯定不少
 


tips:
  Promise主要是解决啥的呢? 个人粗浅地认为:当我们有多个异步请求的时候,想在所有请求都成功的情况下再继续进行其他处理,我们一般的解决方法要么是自己定义一个计数器counter,当每完成一个请求counter++,这样就能判断是否完成所有请求,或者第二个请求在第一个请求成功后再进行.....其实阅读前面的推荐的文章你就知道Promise.all( )就能解决刚才这个需求;当然这只是其中一个例子。

我这边想实现的目的是:
jq的ajax配合promise对象,实现发送2次ajax请求,第二次是在第一次发送请求成功且底层返回状态为成功之后再发送;
原因:
在做SD卡格式化的时候底层要求是当SD卡在发送格式化命令后还需要发送一个挂载的命令,这样去实现的时候会出现回调嵌套,后面得知promise就是为了解决这种问题应运而生的,所以选择去学习一下。


下面是具体代码:(我这边没有介绍基础语法,直接上了撸代码,毕竟前面推荐了文章,所以当大家都懂了语法和基础知识)

如果是用原生的方法:
说明:这里是在WebStorm上进行测试(因为可以模拟一个服务器环境,方便我们使用ajax),我这边也简化了很多步骤,直接去请求一下example.txt这个文档,当获取到正确数据后再去请求第二个文档,也没有进行出错处理等等~~~不严谨
$.ajax({
        type: "post",
        url:"example.txt",
        success:function(data){
           if(data==1)
           {
            $.ajax({
                type: "post",
                url: "example2.txt",
                success: function (data) {
                    console.log(data);
                 }
               });
             }
          }
      }); 

下面是用Promise去做:

这边还用了settimeout去模拟了一下时延,因为在实际操作中请求数据的时候有可能没那么快,因为我测试的时候是在本地;

需要注意的是:
  • then方法里面的回调函数是在这个Promise对象状态改变后调用的;

  • 既然Promise可以链式调用,例如p.then( ).then()....这样,就意味着它肯定会返回一个Promise对象,如果我们在then中自己手动返回了一个数据,那么下一个then的回调函数中可以使用这个数据,但是这个then方法的Promise对象还是上一个对象,代表着上一个Promise对象状态改变了,那么我们如果p.then( ).then( ),里面的回调函数会一个接一个马上调用;如果我们是手动再返回了一个新的Promise对象,那么下一个then方法就是新的Promise中的对象的方法了,是代表新的Promise对象状态改变后的回调函数,而不是前一个,p.then( ).then( )这样调用的话,第二个then需要判断新的Promise状态是否改变才决定是否调用;

var p1 = new Promise(function (resolve) {
    $.ajax({
        type: "post",
        url:"example.txt",
        success:function(data){
            console.log("请求1")
            setTimeout(function(){
                resolve(data);
            },2000);
        }
    });
});

p1.then(function(data){
    console.log("请求1成功:"+data);
    if(data==1)
    {
        var p2= new Promise(function (resolve) {
            $.ajax({
                type: "post",
                url: "example2.txt",
                success: function (data) {
                    console.log("请求2")
                    setTimeout(function () {
                        resolve(data);
                    }, 2000)
                }
            });
        });
        p2.then(function(data) {
             console.log("请求2成功:"+data);
        })
    }
})

当然还可以换一种写法,其实也没差多少
var p1 = new Promise(function (resolve) {
    $.ajax({
        type: "post",
        url:"example.txt",
        success:function(data){
            console.log("请求1")
            setTimeout(function(){
                resolve(data);
            },2000);
        }
    });
});

p1.then(function(data){
    console.log("请求1成功:"+data);
    if(data==1)
    {
        return new Promise(function (resolve) {
            $.ajax({
                type: "post",
                url: "example2.txt",
                success: function (data) {
                    console.log("请求2")
                    setTimeout(function () {
                        resolve(data);
                    }, 2000)
                }
            });
        });
    }
}).then(function(data){
      console.log("请求2成功:"+data);
})







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值