对于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){ ...
随机推荐
- 推荐系统相关算法(1):SVD
假如要预测Zero君对一部电影M的评分,而手上只有Zero君对若干部电影的评分和风炎君对若干部电影的评分(包含M的评分).那么能预测出Zero君对M的评分吗?答案显然是能.最简单的方法就是直接将预测分 ...
- PHP常用字符串处理函数
(1)strlen(string) 返回字符串长度 (2)strpos(string,find,begin) 返回find字符串第一次出现的位置(从0开始) string:处理的字符串 find:想找 ...
- XSS跨站脚步攻击及防范
XSS(Cross Site Script)跨站脚本攻击.它指的是恶意攻击者往Web 页面里插入恶 意html 代码,当用户浏览该页之时,嵌入其中Web 里面的html 代码会被执行,从而达到侵害用户 ...
- RobotFramework自动化测试框架-移动手机自动化测试Click Element关键字的使用
Click Element关键字用来模拟点击APP界面上的一个元素,该关键字接收一个参数[ locator ] ,这里的locator指的是界面元素的定位方式. 示例1:使用Click Element ...
- zoj3954 详细讲解 排序比较单词法
Seven-Segment Display Time Limit: 1 Second Memory Limit:65536 KB A seven segment display, or se ...
- 江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告
编者按:当人们在做技术创新时,我们在做“外包产业“:当人们在做制造产业,我们在做”服务产业“:江人们在做AI智能时,我们在做”物联网“崛起,即使有一个落差,但红色热土从不缺少成长激情. 本期摘自上月初 ...
- Django自定义过滤器中is_safe和need_autoescape两个参数的理解
自定义template过滤器的方法参考文档,不再赘述 is_safe 文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True),但是对is_safe的具体作 ...
- IDoc 基础知识
Application Link Enabling ALE主要为了分布式业务系统而设计的.它可以使业务流程中的每个步骤分布在不同的SAP系统上,系统间可以通过IDoc交互数据.IDoc可以认为是个信封 ...
- hibernate使用注解简化开发
简述 在编写hibernate的时候,需要将实体类映射到数据库中的表.通常需要一个配置文件(hibernate.cfg.xml),一个实体类(XX.Java),还有一个映射文件(XX.hbm.xml) ...
- ClassLoader 工作机制
ClassLoader 采用上级委托接待机制加载 class JVM 平台提供三层 ClassLoader 1.Bootstrap ClassLoader:主要加载 JVM 自身工作需要的类 2.Ex ...