Promise

<!DOCTYPE HTML> 
<html> 
    <head>     
        <meta charset="UTF-8" /> 
        <title>UBR</title>
        <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport"/>
        <meta content="telephone=no" name="format-detection"/>
        <script src="jquery-1.9.1.js"></script>
</head> 
<body>
    <script>

    $(function() {
        /* common code */
        function doneCallBack(value) {
            console.log(value);
        }

        function failCallBack(error) {
            console.log(error);
        }

        function failCallStatus(status) {
            console.log(status);
        }

        /* wait lists */
        function waitA() {
            var def = $.Deferred();
            setTimeout(function() {
                def.resolve("已完成A");
                //def.reject("拒绝了A");
                console.log("已完成A");
            }, 2000);
            return def.promise();
        }

        function waitB() {
            var def = $.Deferred();
            setTimeout(function() {
                def.resolve("已完成B");
                console.log("已完成B");
            }, 2000);

            return def.promise();
        }

        function waitC() {
            var def = $.Deferred();
            setTimeout(function() {
                def.resolve("已完成C");
                console.log("已完成C");
            }, 2000);

            return def.promise();
        }

        function waitD() {
            var def = $.Deferred();
            setTimeout(function() {
                def.resolve("已完成D");
                console.log("已完成D");
            }, 2000);

            return def.promise();
        }

        function waitE() {
            var def = $.Deferred();
            setTimeout(function() {
                def.reject("已拒绝了E");
                console.log("已完成E");
            }, 2000);

            return def.promise();
        }

        function waitF() {
            var def = $.Deferred();
            setTimeout(function() {
                def.resolve("已完成F");
                console.log("已完成F");
            }, 2000);

            return def.promise();
        }

        waitA()
            .then(waitB, failCallBack, failCallStatus)
            .then(waitC, failCallBack, failCallStatus)
            .then(waitD, failCallBack, failCallStatus)
            .then(waitE, failCallBack, failCallStatus)
            .then(waitF, failCallBack, failCallStatus);

/**
Promise/A+规范:
1、一个promise可能有三种状态:
等待(pending)、已完成(fulfilled)、已拒绝(rejected)
2、一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,
不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
3、promise必须实现then方法(可以说,then就是promise的核心),
而且then必须返回一个promise,同一个promise的then可以调用多次,
并且回调的执行顺序跟它们被定义时的顺序一致
4、then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。
同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。
*
*/

    })
    </script>
    
</body>
</html>
<!DOCTYPE HTML> 
<html> 
    <head>     
        <meta charset="UTF-8" /> 
        <title>UBR</title>
        <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport"/>
        <meta content="telephone=no" name="format-detection"/>
        <script src="jquery-1.9.1.js"></script>
</head> 
<body>
    <script>

    $(function() {
        function asyncEvent() {
          var dfd = new jQuery.Deferred();
          var t1 = Math.floor( 400 + Math.random() * 2000 );
          var t2 = Math.floor( 400 + Math.random() * 2000 );
          // Resolve after a random interval
          setTimeout(function() {
              console.log("成功的回调用时", t1);
            dfd.resolve( "hurray" );
          }, t1 );
         
          // Reject after a random interval
          setTimeout(function() {
              console.log("失败的回调用时", t2);
            dfd.reject( "sorry" );
          }, t2 );
         
          // Show a "working..." message every half-second
          setTimeout(function working() {
            if ( dfd.state() === "pending" ) {
              dfd.notify( "working... " );
              setTimeout( working, 500 );
            }
          }, 1 );
         
          // Return the Promise so caller can't change the Deferred
          return dfd.promise();
        }
         
        // Attach a done, fail, and progress handler for the asyncEvent
        $.when( asyncEvent() ).then(
          function( status ) {
            console.log( status + ", things are going well" );
          },
          function( status ) {
            console.log( status + ", you fail this time" );
          },
          function( status ) {
            $( "body" ).append( status );
          }
        );


    })
    </script>
    
</body>
</html>

 

posted @ 2014-08-03 19:45  风之约  阅读(307)  评论(0编辑  收藏  举报