关于promise

后来发现promise是解决异步的一个链式调用的好的方法,避免了所谓的回调的监狱,

它有三个状态,未作为,已经完成和已经失败,起始是未作为,然后有了动作总会有个结果,

分成resolve,已经顺利ok和reject执行失败,promise传递参数就靠这两个状态,已经达成某个状态,那就

不可能再是另外种状态了了!使用方法如我代码:写了好几遍了,实现方式一种是es6的原生的promise对象

另外种方式是jquery的deferred对象.看代码了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise by jquery and es6</title>
    <script type="text/javascript" src=‘../jquery-2.2.3.min.js‘></script>
</head>
<body>
    <h1>this is the promise page test</h1>
    <textarea cols=‘100‘ rows="10"></textarea>

    <script type="text/javascript">
        //first 用es6自带的promise作为尝试的方法来做异步
        /**
        var app = {
            es6_promise:function(url){
                var promise = new Promise(function(resolve,reject){
                    $.ajax({
                        type:‘get‘,
                        data:{},
                        url:url,
                        success:function(msg){
                            resolve(msg);
                            console.log(‘first place ‘+msg);
                        },
                        error:function(msg){
                            reject(msg);
                        }
                    })
                });
                return promise;
            },
            setDely:function(){
                var promise = new Promise(function(resolve,reject){
                    setTimeout(function(){
                        resolve(‘this is setTimeout‘);
                    },2000)
                    // alert(‘this is from ajax msg ‘+ajaxData);
                    alert(‘this is alert after setTimeout‘);
                })
                return promise;
            }
        }
        app.es6_promise(‘/promise/our.json‘)
        .then(function(data){console.log(‘second ‘+data);return ‘hello‘;})
        .then(function(data){console.info(‘third ‘+data)})

        app.setDely()
        .then(function(msg){console.log(msg);return ‘我爱钟亚姬‘})
        .then(function(msg){alert(msg);return ‘我终于可以娶到钟亚姬了‘})
        .then(function(data){alert(data)});
        **/

        //jquery 的deferred jquery版本高于1.5方可
        //deferred情况一,连续的链式调用
        /*
        $.ajax({
            url:‘/promise/plan.json‘,
            type:‘get‘,
            data:{},
            dataType:‘json‘,
        }).done(function(msg){
            console.log(‘first time successfully!‘);
            console.info(msg);
        }).done(function(msg){
            console.log(‘second time successfully!‘);
            console.info(msg);
        }).fail(function(data){
            console.log(‘this is first time that i am fail!‘);
        })
        */

        //$.when来处理多个defer对象[处理延时和回调的方法]
        /*
        $.when($.ajax({url:‘/promise/plan.json‘,type:‘get‘}),$.ajax({url:‘/promise/our.json‘,type:‘get‘}))
        .done(function(first,second){
            alert(‘request is finished‘);console.log(first);console.info(second)
        })
        */

        /*自定义的deferred的方法来解决异步问题!*/

        /*这样不行,因为没有定义deferred对象,执行会先显示here is done再出现alert
            function wait(){
                var task = function(){
                    alert(‘hello , I success later‘);
                }
                setTimeout(task,3000);
            }
            $.when(wait())
            .done(function(){console.log(‘here is done‘)})
            .fail(function(){console.log(‘here is fali‘)})
        */

        //自己定义deferred对象即可
        /*
        var promise_jquery = $.Deferred();

        var wait = function(promise_jquery){
            var deal = function(){
                alert(‘i am async inside‘);
                //这里是体现了仅仅有一种状态发生在一个函数内部所以,哈哈
                promise_jquery.resolve(‘this is the data be back‘);
                promise_jquery.reject(‘this is erro  inside‘);//这个没有接收到
            }
            setTimeout(deal,3000);
            return promise_jquery;
        }
        $.when(wait(promise_jquery))
        .done(function(data){
            alert(data);
        })
        //对应上述,这里纠正产没有反应了
        .fail(function(data){
            alert(data)
        })
        */

        //防止状态外部被改变的方法
        /*
        var wait = function(){
            var dtd = $.Deferred();
            var in_ = function(){
                alert(‘this is inside function‘);
                dtd.resolve(‘I miss you zhongyaji‘);
            }
            setTimeout(in_,2000);
            return dtd.promise();
        }

        $.when(wait())
        .done(function(msg){
            alert(msg);
        }).done(function(){
            alert(‘I love you fairy‘);
        })
        */
    </script>

    <!--再来描绘一遍,复习一发-->
    <script type="text/javascript">
        // var zhongyaji = function(){
        //     var promise = new Promise(function(resolve,reject){
        //         $.ajax({
        //             url:‘/promise/our.json‘,
        //             type:‘get‘,
        //             data:{},
        //         }).done(function(data){
        //             resolve(data);
        //         }).fail(function(data){
        //             reject(data);
        //         })
        //     })
        //     return promise;
        // }
        // zhongyaji().then(function(data){
        //     console.log(data);
        // })

        // function fairy(){
        //     var promise = new Promise(function(resolve,reject){
        //         setTimeout(function(){
        //             console.log(‘我爱钟亚姬,哈哈,好怪‘);
        //             resolve(‘I love you!‘)
        //         },2000);
        //     })
        //     return promise;
        // }
        // fairy().then(function(data){
        //     console.log(data);
        // })
        //哈哈,这些实例老子写的还是溜得不行啦哈哈
        function sleep(){
            var defer = $.Deferred();
            setTimeout(function(){
                alert(‘my love to you is deep‘);
                defer.resolve(‘this is love‘);
            },3000)
            return defer.promise();
        }
        $.when(sleep()).done(function(data){
            console.log(data);
        })
    </script>

</body>
</html>
时间: 2024-10-09 21:15:42

关于promise的相关文章

promise方法

promise TemplateService.uploadTempate(fieKey).then(function(result){sef.memKay = result.data},function(error){console.log(error)}) 只要有then,它就是一个promise. TemplateService.uploadTempate(fieKey)返回一个promise,承诺如果TemplateService.uploadTempate(fieKey)函数执行成功,

Promise 原理探究及其简单实现

可移步 http://donglegend.com/2016/09/11/promise%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/ 观看 Promise是个什么玩意,大家都知道,度娘告诉我,以同步方式书写异步,解决回调地狱... 状态机 早闻Promise的大名,简单介绍,根据状态改变来执行相应处理函数.Promise的状态极其简单,只有 “pending”, “resolved”, “rejected”三种状态然后就是如何实现的问题,最关键的当然是监听到状态的更

【Mocha.js 101】同步、异步与 Promise

前情提要 在上一篇文章<[Mocha.js 101]Mocha 入门指南>中,我们提到了如何用 Mocha.js 进行前端自动化测试,并做了几个简单的例子来体验 Mocha.js 给我们带来的便利. 在本篇文章中,我们将了解到 Mocha.js 的同步/异步测试,以及如何测试 Promise. 同步代码测试 在上一篇文章中,其实我们已经学会了如何测试同步代码.今天,我们 BDD 风格编写一个测试: var should = require( 'should' ); var Calculator

Promise实现多图预加载

Promise正如它的中文意思"承诺"一样,保存着未来会发生事件(一般为异步操作).Promise避免了"回调地狱",写法更加接近同步操作.说到同步,我更加喜欢async.await,它们书写更贴近同步操作. 图片加载往往是异步的,如果有操作需要等到所有的图片加载完之后再执行,这时候就需要不断的监听所有图片的加载情况. ES5 利用ES5实现多图预加载,可以通过计数器判断有多少图片加载完成. var count = 0, // 计数器 imgs = []; /* *

摘抄 Promise原理

1.简单的promise: //极简promise雏形 function Promise(fn){ var value = null; callbacks = [];//callback为数组,因为可以同时有很多个回调 this.then = function(onFulfilled){ callbacks.push(onFulfilled); } function resolve(value){ callbacks.forEach(function(callback){ callback(va

从源码看 Promise 概念与实现

Promise 是 JS 异步编程中的重要概念,它较好地解决了异步任务中回调嵌套的问题.在没有引入新的语言机制的前提下,这是如何实现的呢?上手 Promise 时常见若干晦涩的 API 与概念,它们又为什么存在呢?源码里隐藏着这些问题的答案. 下文会在介绍 Promise 概念的基础上,以一步步代码实现 Promise 的方式,解析 Promise 的实现机制.相应代码参考来自 PromiseJS 博客 及 You don't know JS 的若干章节. Why Promise (有使用 Pr

从C#到TypeScript - Promise

从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌套不仅让代码读起来十分困难,维护起来也很不方便.其实C#在Task出现之前也是有类似场景的,Async Programming Mode时代,用Action和Func做回调也很流行,不过也是意识到太多的回调嵌套代码可读性差且维护不易,微软引入了Task和Task-based Async Pattern.虽然不知道是哪个语言最早有这个概念,

Promise粗解

一.Promise含义.作用.特点 Promise含义 异步编程的一种解决方案: 简单来说就是一个容器,里面保存这某个未来才会结束的事件(异步操作)的结果: 从语法上来讲,是一个对象,可以获取异步操作的消息: Promise作用 可避免回调金字塔式的代码: 优化异步流程: 得到异步流程中的错误: Promise对象的特点 对象的状态不受外界影响 Promise对象代表一个异步操作,用三种状态:pending(进行中).resolve(已完成).reject(已失败),只有异步操作的结果,可以决定

自己实现ES6中的Promise API

Promise API是ES6的推荐标准,该API是由各JavaScript的执行引擎在底层,通常是使用C++语言实现的 为了更好地理解Promise API的使用方法并探究其可能的实现方式,笔者在JavaScript层面对Promise API进行了实现. 该实现只是作为实验.学习使用,虽然与内置的实现功能相同,但是在设计和运行效率上肯定是不能相提并论. 我也希望之后能对自己的实现进行改善. 该实现在处理异步任务时,采用了轮询的方式来检测其状态的变化. 具体代码如下(注:笔者采用Node方式进

循环/闭包/setTimeout/Promise 综合

控制台显示内容为? for (var i = 0; i < 5; i++) { console.log(i); } 控制台显示内容为? for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000 * i); } 控制台显示内容为? for (var i = 0; i < 5; i++) { (function(i) { setTimeout(function() { console.log(i