对于ES6中Promise的个人见解
1.js中常见的异步
- JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作。
let button = document.getElementById("btn");
buttom.onclick = function(event){
console.log(“I was clicked !!")
};
- 在Node.js中更是使用大量的回调来代替事件来实现异步编程。
node中读取文件方法及参数
fs.readFile(filename, [encoding], [callback(err,data)]);
var fs = require('fs');
fs.readFile('/Users/xiaosong/Desktop/example.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
2.但是事件和回调并不能满足需求,比如像并行执行两个异步操作,两个操作结束时都通知你,或者说同时进行两个异步操作,
想要优先完成的通知你。想要满足这些你可能写很多的回调,而Promise可以很好的解决这些问题。
3.那么什么是Promise呢?
- 我的理解就是它只是另一种异步编程的选择,就像事件和回调函数一样指定稍后执行的代码,但是它可以指示代码是否成功的执行,基于成功和失败的状态分别执行什么,更加易于理解和调试。
let fs = require("fs");
function readFile(filename){
return new Promise(function(resolve,reject){
// Promise只接受一个参数叫做执行器函数,接受resolve和reject两个函数
fs.readFile(filename,{encoding:"utf-8"},function(err,data){
//错误优先,检查是否出错
if(err){
reject(err);
return;
}
//成功读取文件
resolve(data);
});
});
};
let promise = readFile("/Users/xiaosong/Desktop/example.txt");
promise.then(function(data){
//完成
console.log(data);
},function(err){
//拒绝
console.log(err.message);
});
输出的是---->就算失败也要摆出豪迈的姿态。<---- 很明显这是陈咬金的台词!!
这就是一个完整的Promise了。看到这里感觉估计还是蒙逼的请让在下为你细细道来
let promise = new Promise(function(reslove,reject){
console.log("A");
reslove();
});
promise.then(function(){
console.log("B");
});
console.log("C");
输出ACB
- 为什么会这样输出呢? 就是因为执行器中调用了resolve();
当这个状态结束后会进入下面两种状态之一:
内部有[[PromiseState]]这个属性来表示这三种状态,但是这个属性又没有在Promise上暴漏出来所以并不能对它进行编程来检测Promise所处的状态,那么怎么办呢。
promise.then(function(data){
//完成
console.log(data);
},function(err){
//拒绝
console.log(err.message);
});
promise.then(null,function(err){
//拒绝
console.log(err.message);
});
那么我以上讲的创建的都是未完成的Promise,可能乍一看来创建未完成的Promise尚且有意义但是创建已处理的有什么意义呢!
let promise = Promise.reject("我是一段安静的文字,你不会知道我是安静的");
promise.catch(function(value){
console.log(value); // 我是一段安静的文字,你不会知道我是安静的
});
let promise = Promise.resolve("我是一段安静的文字,你不会知道我是安静的");
promise.then(function(value){
console.log(value); // 我是一段安静的文字,你不会知道我是安静的
});
有then()方法并且接受resolve和reject两个参数的普通对象:
let thenable = {
then: function(resolve, reject){
resolve("我是一段开心的文字,没人知道我在乐啥");
}
};
let promise = Promise.resolve(thenable);
promise.then(function(value){
console.log(value) //我是一段开心的文字,没人知道我在乐啥
});
<script>
function MyPromise(func){
var deferred = $.Deferred();
func(deferred.resolve, deferred.reject);
return deferred.promise();
};
new MyPromise(function(resolve, reject){
console.log(1);
resolve();
console.log(2);
}).then(function(){
console.log(3);
});
console.log(4);
// 在jquery1.6.4的版本下输出是1234
// 在jquery3.2.1中输出是 1243
</script>
在ES6中
new Promise(function (resolve,reject) {
console.log(1);
resolve();
console.log(2);
}).then(function () {
console.log(3);
});
console.log(4);
// 这里同样输出的也是1243
从这里看JQuery也是在向标准看齐的。
let promise = new Promise(function(resolve,reject){
resolve("淡定的文字");
});
promise.then(function(value){
console.log(value);
return value + ",不开心"
}).then(function(value){
console.log(value);
return value + "怎么办"
}).then(function(value){
console.log(value);
throw new Error("又错了");
}).catch(function(err){
console.log(err.message);
});
输出:
淡定的文字
淡定的文字,不开心
淡定的文字,不开心怎么办
又错了
我是这样理解的每一次调用then()后都会再一次返回一个新的promise,这样新的Promise就又会接着调用后面的then()就这样一直下去直到最后一个then();
let p1 = new Promise(function(resolve,reject){
resolve("OK one");
});
let p2 = new Promise(function(resolve,reject){
reject("refuse two");
});
let p3 = new Promise(function(resolve,reject){
resolve("OK three");
});
let p4 = Promise.all([p1,p2,p3]);
p4.catch(function(value){
console.log(Array.isArray(value)); //false
})
let p1 = new Promise(function(resolve,reject){
resolve("OK one");
});
let p2 = new Promise(function(resolve,reject){
resolve("refuse two");
});
let p3 = new Promise(function(resolve,reject){
resolve("OK three");
});
let p4 = Promise.all([p1,p2,p3]);
p4.then(function(value){
console.log(Array.isArray(value)); //true
})
8.能够监听多个Promise的方法还有Promise.race();它的参数和Promise.all()是相同的,返回的也是一个Promise,但是使用这个方法监听的是最先被解决的Promise,谁先被解决就返回谁,无需等到所有的Promise都完成。
let p1 = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("OK one");
},200);
});
let p2 = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("OK two");
},100);
});
let p3 = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("OK three");
},300);
});
let p4 = Promise.race([p1,p2,p3]);
p4.then(function(value){
console.log(value); //two
})
ok 这就是我对promise的浅见。
---恢复内容结束---
1.js中常见的异步
- JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作。
let button = document.getElementById("btn");
buttom.onclick = function(event){
console.log(“I was clicked !!")
};
- 在Node.js中更是使用大量的回调来代替事件来实现异步编程。
node中读取文件方法及参数
fs.readFile(filename, [encoding], [callback(err,data)]);
var fs = require('fs');
fs.readFile('/Users/xiaosong/Desktop/example.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
2.但是事件和回调并不能满足需求,比如像并行执行两个异步操作,两个操作结束时都通知你,或者说同时进行两个异步操作,
想要优先完成的通知你。想要满足这些你可能写很多的回调,而Promise可以很好的解决这些问题。
3.那么什么是Promise呢?
- 我的理解就是它只是另一种异步编程的选择,就像事件和回调函数一样指定稍后执行的代码,但是它可以指示代码是否成功的执行,基于成功和失败的状态分别执行什么,更加易于理解和调试。
let fs = require("fs");
function readFile(filename){
return new Promise(function(resolve,reject){
// Promise只接受一个参数叫做执行器函数,接受resolve和reject两个函数
fs.readFile(filename,{encoding:"utf-8"},function(err,data){
//错误优先,检查是否出错
if(err){
reject(err);
return;
}
//成功读取文件
resolve(data);
});
});
};
let promise = readFile("/Users/xiaosong/Desktop/example.txt");
promise.then(function(data){
//完成
console.log(data);
},function(err){
//拒绝
console.log(err.message);
});
输出的是---->就算失败也要摆出豪迈的姿态。<---- 很明显这是陈咬金的台词!!
这就是一个完整的Promise了。看到这里感觉估计还是蒙逼的请让在下为你细细道来
let promise = new Promise(function(reslove,reject){
console.log("A");
reslove();
});
promise.then(function(){
console.log("B");
});
console.log("C");
输出ACB
- 为什么会这样输出呢? 就是因为执行器中调用了resolve();
当这个状态结束后会进入下面两种状态之一:
内部有[[PromiseState]]这个属性来表示这三种状态,但是这个属性又没有在Promise上暴漏出来所以并不能对它进行编程来检测Promise所处的状态,那么怎么办呢。
promise.then(function(data){
//完成
console.log(data);
},function(err){
//拒绝
console.log(err.message);
});
promise.then(null,function(err){
//拒绝
console.log(err.message);
});
那么我以上讲的创建的都是未完成的Promise,可能乍一看来创建未完成的Promise尚且有意义但是创建已处理的有什么意义呢!
let promise = Promise.reject("我是一段安静的文字,你不会知道我是安静的");
promise.catch(function(value){
console.log(value); // 我是一段安静的文字,你不会知道我是安静的
});
let promise = Promise.resolve("我是一段安静的文字,你不会知道我是安静的");
promise.then(function(value){
console.log(value); // 我是一段安静的文字,你不会知道我是安静的
});
有then()方法并且接受resolve和reject两个参数的普通对象:
let thenable = {
then: function(resolve, reject){
resolve("我是一段开心的文字,没人知道我在乐啥");
}
};
let promise = Promise.resolve(thenable);
promise.then(function(value){
console.log(value) //我是一段开心的文字,没人知道我在乐啥
});
<script>
function MyPromise(func){
var deferred = $.Deferred();
func(deferred.resolve, deferred.reject);
return deferred.promise();
};
new MyPromise(function(resolve, reject){
console.log(1);
resolve();
console.log(2);
}).then(function(){
console.log(3);
});
console.log(4);
// 在jquery1.6.4的版本下输出是1234
// 在jquery3.2.1中输出是 1243
</script>
在ES6中
new Promise(function (resolve,reject) {
console.log(1);
resolve();
console.log(2);
}).then(function () {
console.log(3);
});
console.log(4);
// 这里同样输出的也是1243
从这里看JQuery也是在向标准看齐的。
let promise = new Promise(function(resolve,reject){
resolve("淡定的文字");
});
promise.then(function(value){
console.log(value);
return value + ",不开心"
}).then(function(value){
console.log(value);
return value + "怎么办"
}).then(function(value){
console.log(value);
throw new Error("又错了");
}).catch(function(err){
console.log(err.message);
});
输出:
淡定的文字
淡定的文字,不开心
淡定的文字,不开心怎么办
又错了
我是这样理解的每一次调用then()后都会再一次返回一个新的promise,这样新的Promise就又会接着调用后面的then()就这样一直下去直到最后一个then();
let p1 = new Promise(function(resolve,reject){
resolve("OK one");
});
let p2 = new Promise(function(resolve,reject){
reject("refuse two");
});
let p3 = new Promise(function(resolve,reject){
resolve("OK three");
});
let p4 = Promise.all([p1,p2,p3]);
p4.catch(function(value){
console.log(Array.isArray(value)); //false
})
let p1 = new Promise(function(resolve,reject){
resolve("OK one");
});
let p2 = new Promise(function(resolve,reject){
resolve("refuse two");
});
let p3 = new Promise(function(resolve,reject){
resolve("OK three");
});
let p4 = Promise.all([p1,p2,p3]);
p4.then(function(value){
console.log(Array.isArray(value)); //true
})
8.能够监听多个Promise的方法还有Promise.race();它的参数和Promise.all()是相同的,返回的也是一个Promise,但是使用这个方法监听的是最先被解决的Promise,谁先被解决就返回谁,无需等到所有的Promise都完成。
let p1 = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("OK one");
},200);
});
let p2 = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("OK two");
},100);
});
let p3 = new Promise(function(resolve,reject){
setTimeout(function(){
resolve("OK three");
},300);
});
let p4 = Promise.race([p1,p2,p3]);
p4.then(function(value){
console.log(value); //two
})
ok 这就是我对promise的浅见。
对于ES6中Promise的个人见解的更多相关文章
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- ES6中promise的使用方法
先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...
- ES6中promise总结
一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...
- ES6 中 Promise
在说Promise之前我们先简单说一下什么是同步异步? 同步(Sync):所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 异步(Async):异步与同步相对, ...
- ES6中Promise的入门(结合例子)
一.Promise的前言 解决回调地狱 //以往回调方式 函数1(function(){ //代码执行...(ajax1) 函数2(function(){ //代码执行...(ajax2) 函数3(f ...
- ES6 中 Promise 详解
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...
- ES6中Promise详解
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 AP ...
- 阿里前端测试题--关于ES6中Promise函数的理解与应用
今天做了阿里前端的笔试题目,原题目是这样的 //实现mergePromise函数,把传进去的数组顺序先后执行,//并且把返回的数据先后放到数组data中 const timeout = ms => ...
- 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) { if (success){ ...
随机推荐
- Ionic3学习笔记(三)禁止横屏
本文为原创文章,转载请标明出处 目录 安装 使用 参数 1. 安装 命令行输入 ionic cordova plugin add cordova-plugin-screen-orientation n ...
- linux下快速列出文件列表的方法
前言 这两天碰到一个很棘手的问题,需要读取出ubuntu系统中某个目录下所有文件,由于服务器中存储的文件实在太多,导致此过程效率十分低下,动辄需要等待一个小时之久,还只是一个目录.于是如何快速获取文件 ...
- Windows+Apache2.4.10+PHP7.0+MySQL5.6.21安装
一.安装包下载 apache2.4.10 http://www.apachelounge.com/download/win64/ PHP7.0.7 http://windows.php.net/dow ...
- Python自学笔记-paramiko模块(Mr serven)
文章出处:http://www.cnblogs.com/wupeiqi/articles/5095821.html SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: #!/u ...
- HDU1024 DP的优化 最大M子段和问题
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- c#(asp.net) 多线程示例,用于同时处理多个任务
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- ssm搭建报错
在搭建ssm框架时候踩得坑:1.对于拦截器url-parttern的设置:第一次设置的是/** 本以为这个是表示拦截所有,没想到这是错误的写法,正确的写法是/ 启动项目不会报错,但是会出现404 ...
- TensorFlow问题:The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
1. 问题描述 The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available o ...
- wpf GifBitmapDecoder 解析 gif 格式
在网上有很多图片都是gif,那么如何在 wpf 解析 gif? 本文告诉大家如何使用 GifBitmapDecoder 把gif分开为一张一张,获得他的信息. 如果需要把一个 gif 分开,使用的代码 ...
- CMake必知必会
CMake 文档 https://cmake.org/cmake/help/v3.7/index.html 需要阅读的文档 item note link cmake-buildsystem(7) cm ...