zoukankan      html  css  js  c++  java
  • Promise API

    Promise API
        刚刚接触promise这个东西,网上看了很多博客,大部分是讲怎么用Promise,丝毫没提怎么实现Promise。 我不甘
    心,可是真去看JQuery或者AngularJs中Promise的源码又觉得云里雾里。于是就想自己先试试能不能实习Promise的API,
    然后再看源码深入学习。 (因为我觉得别人就算再怎么聪明,也不可能跳出Javascript的框架,我自己的实现无论如何
    都应该可以为我学习Promise提供一定的基础。)
        通过一些博客,我也大体知道Promise的使用效果,觉得它有点类似Java中的观察者模式。Promise API中通过then
    方法注册观察者,通过resolve或者reject方法通知观察者。有了这么个想法,实现Promise就简单了
        首先定义一个类:
        function Derfer(){

        }
        这个类(或者说方法)必须返回一个包含resolve,reject,then方法的对象,于是改造类如下:
        function Derfer(){
        
            return {
                resolve:function(){},
                reject:function(){},
                then:function(success,error){
                
                }
            };
        }
        现在要让then注册的观察者success(先称为成功观察者)和error(先成为失败观察者)能够分别在resolve和reject
    方法中执行,那么最简单的方式就是通过全局变量,如下:
        function Derfer(){
            var obj={
                success:function(){},
                error:function(){}
                };
            return {
                resolve:function(){
                    obj.success();
                },
                reject:function(){
                    obj.error();
                },
                then:function(success,error){
                    obj.success=success;
                    obj.error=error;
                }
            };
        }
    于是Defer 类就完成了。 现在用这个类试试能不能达到promise的效果。

        var d=new Derfer();
        /*这个get方法的实现可以放在某个库里面*/
        function get(url){
            $.ajax({
                url:url,
                success:function(){
                    d.resolve();
                },
                error:function(){
                    d.reject();
                }
            });
            return d;
        }
        /*对使用者来说只要调用下面的方法就行了*/
        get("http://xxx")
        .then(function(){
            alert('this is success');
        },function(){
            alert('this is error');
        });

    当然实际编程中可能还要考虑更多的东西,不过我觉得Promise的核心实现也就应该是这个了。









  • 相关阅读:
    while循环学习之统计流量
    MySQL的启动脚本
    UVA 725 Division
    UVA 712 S-tree
    UVA 514
    字典树
    UVA 1595 multimap 的应用
    C++ map 和 multimap
    浮点数
    UVA 227
  • 原文地址:https://www.cnblogs.com/formyjava/p/4166312.html
Copyright © 2011-2022 走看看