后来发现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>

关于promise的更多相关文章

  1. Javascript - Promise学习笔记

    最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下.   一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...

  2. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  3. angular2系列教程(七)Injectable、Promise、Interface、使用服务

    今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...

  4. 闲话Promise机制

    Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...

  5. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  6. Promise的前世今生和妙用技巧

    浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...

  7. JavaScript进阶之路——认识和使用Promise,重构你的Js代码

    一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~.进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半 ...

  8. 细说Promise

    一.前言 JavaScript是单线程的,固,一次只能执行一个任务,当有一个任务耗时很长时,后面的任务就必须等待.那么,有什么办法,可以解决这类问题呢?(抛开WebWorker不谈),那就是让代码异步 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  10. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

随机推荐

  1. Dynamics CRM 2011编程系列(60):JS编程之CRUD辅助类(JQuery版)

    今天给大家分享一个JQuery版的REST辅助类,在一年前我分享过一个只能在IE环境下运行的REST辅助类:<JS编程之实体CRUD辅助类 >.为什么要推出JQuery版的CRUD辅助类呢 ...

  2. C# 哈希表的实现

    8.4.2 Hashtable的代码实现   哈希表的实现较为复杂,为了简化代码,本例忽略了部分出错判断,在测试时请不要设key值为空.   1 using System; 2 public clas ...

  3. C++ Prime:sizeof运算符

    sizeof运算符的结果部分地依赖于其作用的类型: 对char或者类型为char的表达式执行sizeof运算结果得1: 对引用类型执行sizeof运算得到被引用对象所占空间的大小: 对指针执行size ...

  4. IE的表头固定/表头不动(使用expression)

    本文主要介绍在IE浏览器中,实现表头固定的一种方法.这种方法使用到了 IE 浏览器特有的 expression 方法. 表头固定DEMO1 主要代码: <style type="tex ...

  5. maya 操作自我整理(一)

    绘制曲线时的点的控制 当我们在使用CV Curve Tool或者EP Curve Tool创建NURBS曲线的过程中,按下"Insert"键,配合键盘上的上.下箭头方向键,可以自由 ...

  6. OpenOffice 服务开机启动

    1.准备以下软件 OpenOffice3.0,Windows Resource Kit Tools 分别默认安装 2.打开Windows Resource Kit Tools -> Comman ...

  7. hud1856 并查集

    Problem Description Mr Wang wants some boys to help him with a project. Because the project is rathe ...

  8. Android 解决ScrollView下嵌套ListView进页面不在顶部的问题

    以下为整理: 方法1 刚开始还可以,后来再调试时就不行了. 为了解决scrollview和listview冲突  设置了listview的高度   结果进页面就不是在顶部了 . 解决方案1:Scrol ...

  9. myisam MySQL 锁问题

    2016-07-23  (点击上方公众号,可快速关注) 来源:阿里云 RDS - 数据库内核组 链接:http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近 ...

  10. tomcat 配置https (单向认证)

    1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源 2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址 如果只是加密,单向就行 如果想要用系统的人没有证书 ...