Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

1.promise是一构造函数,既然是构造函数,那么我们就可以用 new Promise()得到一个promise实列。

2.在promise上,有来给个函数,分别叫做resolve(成功之后的回调函数)和 reject(失败之后的的回调函数)

3.在promise构造函数的protype属性上,有一个.then()方法,也就是说,只要是promise构造函数创建的实例,都可以访问到.then()方法。

4.Promise表示一个异步操作;每当我们new一个promise的实例,这个实力,好表示一个具体的异步操作;

5.既然promise创建的实例,是一个异步操作,那么,这个异步操作的结果,只有两种状态

  5.1状态1:异步执行成功了,需要在内部调用成功的回调函数resolve把结果返回调用者

  5.2状态2:异步执行失败了,需要在内部调用失败的回调函数reject把结果返回调用者

  5.3由于promise的实例是一个异步操作,所以,内部拿到操作的结果后,无法使用return把操作的结果返回调研组,这时候,只能使用回调函数的形式,来把成功或失败的的结果,返回调用者。

function getFilePath(fpath){
var promise=new Promise(function(resolve,reject){
fs.readFile(fpath,'utf8',(err,dataStr)=>{ // 这里面使用return不能返回值, 只能调用回调
if(err) return reject(err);
resolve(dataStr)
})
})
return promise;
}
var p=getFilePath('1.txt');
p.then(function(data){
console.log(data)
},function(err){
// console.log(data+'+++++');
console.log(err.message)
})

promise的正确使用方式

 // 串联的方式
// 读取文件1
const fs=require('fs')
function getFilePath(fpath){
return new Promise(function(resolve,reject){
fs.readFile(fpath,'utf8',(err,dataStr)=>{ // 这里面使用return不能返回值, 只能调用回调
if(err) return reject(err);
resolve(dataStr)
})
})
}
// 先读取文件1,再读取文件2,文件3,
// 如果前面的promise的执行失败,我们不想让后续的promise操作被终止,可以为每个promise指定失败的回调
getFilePath('11.txt').then(function(data){
console.log(data);
// 读取文件2
return getFilePath('2.txt')
},function(err){ console.log('这是失败的结果'+err.message);
// return 一个新的promise,不耽误后面的执行
return getFilePath('2.txt')
}).then(function(data){
console.log(data);
// 读取文件3
return getFilePath('3.txt')
}).then(function(data){
console.log(data)
})

当我们有这样的需求,哪怕前面的promise执行失败了,但是不要影响后续promise的正常执行,此时,我们可以单独为每个promise,通过.then指定下一个失败的回调

2.有时候,我们有这样的需求,和上面的需求相反,如果后续的promise执行,依赖于前面promise执行结果,如果前面的失败了,则后面的就没有继续执行下去的意义了,此时,我们想要

实现,一旦有报错则立即终止所有的promise执行

 const fs=require('fs')
function getFilePath(fpath){
return new Promise(function(resolve,reject){
fs.readFile(fpath,'utf8',(err,dataStr)=>{ // 这里面使用return不能返回值, 只能调用回调
if(err) return reject(err);
resolve(dataStr)
})
})
}
// 先读取文件1,再读取文件2,文件3,
// 如果前面的promise的执行失败,我们不想让后续的promise操作被终止,可以为每个promise指定失败的回调
getFilePath('1.txt').then(function(data){
console.log(data);
// 读取文件2
return getFilePath('12.txt')
}).then(function(data){
console.log(data);
// 读取文件3
return getFilePath('3.txt')
}).then(function(data){
console.log(data)
}).catch(function(err){
// catch作用:如果前面有任何的promise执行失败,即立即终止所有的promise的执行
// 并马上进入catch去处理promise中并抛出异常
console.log(err.message)
})

使用promisej结合ajax

    <button type="button" value="获取数据" id="btn">"获取数据</button>
<script>
$(function(){
$('#btn').on('click',function(){
$.ajax({
url:'data.json',
type:'get',
dataType:'json', }).then(function(data){
console.log(data);
})
})
})
</script>

ES6 promise学习的更多相关文章

  1. ES6 promise学习笔记 -- 基本用法

    ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个Promise实例. const promise = new Promise(function(reso ...

  2. 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

    Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...

  3. 解析ES6 Promise

    ES6 Promise 概念之类的,大概读者都应该有所知道,接下来我们直入终点. 先让我们来看看什么是Promise吧,他是一个object,类,arry,function? 首先,学习它的时候应该讲 ...

  4. Promise学习

    转自:http://www.cnblogs.com/lvdabao/p/es6-promise-1.html 去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被 ...

  5. ES6 Promise 接口

    构造函数 new Promise(function(resolve, reject){}); 构造函数接受一个函数(executor)作为参数,该函数在返回 Promise 实例之前被调用.函数的两个 ...

  6. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  7. ES6 Promise 全面总结

    转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...

  8. ES6 Promise 异步操作

    最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...

  9. 微信小程序Http高级封装 es6 promise

    公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是  数据请求! 看了下小程序的请求方式大概和a ...

随机推荐

  1. sqlalchemy查询结果类型简析

    Sqlalchemy的查询方式有很多种,例如可以查询全部,可以查询符合条件的,可以查询指定字段的.那么这么多种查询,返回的结果是不是一样的呢?作本文记录分析结果. Sql_forengin.py #c ...

  2. [Android] Android RxJava2+Retrofit2+OkHttp3 的使用

    [Android] Android RxJava2+Retrofit2+OkHttp3 简单介绍Retrofit.OKHttp和RxJava之间的关系: Retrofit:Retrofit是Squar ...

  3. Java设计模式之抽象工厂

    概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  4. jQuery AJAX 方法 success()后台传来的4种数据

    JAVA中的四种JSON解析方式详解 jQuery AJAX 方法 success()后台传来的4种数据 1.后台返回一个页面 js代码 /**(1)用$("#content-wrapper ...

  5. 理解 Web 中的Session

    ===================================Session 工作原理是什么?===================================因为 http 协议是无状态 ...

  6. vim配置(使用Vundle)

    1.前言 Vim的配置文件位于~/.vimrc,文件使用VimScript语法来编写. 2. vim插件管理 Vundle是一个全自动的插件管理器,让我们通过维护插件列表的方式管理插件.它为安装.更新 ...

  7. nginx——location匹配流程图

    location匹配流程图 location理解 1.收到url请求后,nginx首先进行精确匹配(有“=”的为精确匹配),如果匹配成功,则直接返回精确匹配结果,如果没有命中则会继续向下进行普通匹配 ...

  8. WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)

    如第一个示例所示,如果将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素.这种情况下,x:Key 隐式设置为 {x:Ty ...

  9. ESP8266代码中的存储标记

    const uint8 MyArr[1024] ICACHE_RODATA_ATTR = {0}; void MyFun() ICACHE_FLASH_ATTR { } 这种 ICACHE 开头的宏作 ...

  10. 如何把PDF文件拆分为多个文件

    一个PDF文件有很多个PDF页面组成,有时候我们只需要单个页面的时候应该怎么做呢,这个时候就需要拆分PDF文件了,那么如何把 PDF文件拆分为多个文件呢,应该有很多的小伙伴都想知道吧,那就让我们一起来 ...