Promise补全
This commit is contained in:
parent
0b9bfa8685
commit
ecfe262458
@ -19,7 +19,7 @@ Jenkins是一款由Java编写的开源的**持续集成**工具
|
|||||||
```bash
|
```bash
|
||||||
java -jar jenkins.war
|
java -jar jenkins.war
|
||||||
```
|
```
|
||||||
默认在8080端口运行
|
默认在8080端口运行, 修改运行端口可以加参数`--httpPort=8081`
|
||||||
运行之后访问可以进行初始化操作
|
运行之后访问可以进行初始化操作
|
||||||
输入首次运行时生成的初始化密码
|
输入首次运行时生成的初始化密码
|
||||||

|

|
||||||
|
|||||||
@ -13,7 +13,7 @@ categories:
|
|||||||
例如 : 使用定时器去执行一个回调函数
|
例如 : 使用定时器去执行一个回调函数
|
||||||
```javascript
|
```javascript
|
||||||
function callback(){
|
function callback(){
|
||||||
console.debug("Time Out!");
|
console.debug("Time Out!");
|
||||||
}
|
}
|
||||||
console.log("before");
|
console.log("before");
|
||||||
setTimeout(callback,1000);
|
setTimeout(callback,1000);
|
||||||
@ -32,11 +32,11 @@ Ajax的异步请求也是一种异步操作
|
|||||||
```javascript
|
```javascript
|
||||||
var status = true;
|
var status = true;
|
||||||
function test(resolve, reject) {
|
function test(resolve, reject) {
|
||||||
if (status) {
|
if (status) {
|
||||||
resolve('success');
|
resolve('success');
|
||||||
} else {
|
} else {
|
||||||
reject('failed');
|
reject('failed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var p1 = new Promise(test);
|
var p1 = new Promise(test);
|
||||||
//then传入的是resolve的实现
|
//then传入的是resolve的实现
|
||||||
@ -44,10 +44,11 @@ var p1 = new Promise(test);
|
|||||||
p1.then(console.log).catch(console.error);
|
p1.then(console.log).catch(console.error);
|
||||||
/*
|
/*
|
||||||
也可以用如下的方式, 实际效果同上
|
也可以用如下的方式, 实际效果同上
|
||||||
p1.then(console.log, console.log);
|
p1.then(console.log, console.error);
|
||||||
*/
|
*/
|
||||||
```
|
```
|
||||||
Promise对象在创建的时候 , 传入的这个函数当中并不关心成功与失败具体的回调是什么 , 而只是关心何时去执行该回调函数
|
Promise对象在创建的时候 , 接收一个函数(这个函数是同步执行的)
|
||||||
|
传入的这个函数当中并不关心成功与失败具体的回调是什么 , 而只是关心何时去执行该回调函数
|
||||||
|
|
||||||
Promise对象有3种状态
|
Promise对象有3种状态
|
||||||
1. `Fulfilled` 成功的状态
|
1. `Fulfilled` 成功的状态
|
||||||
@ -64,22 +65,24 @@ Promise对象有3种状态
|
|||||||
```javascript
|
```javascript
|
||||||
var status = true;
|
var status = true;
|
||||||
function test(resolve, reject) {
|
function test(resolve, reject) {
|
||||||
if (status) {
|
//这里的代码是同步执行的
|
||||||
resolve('success');
|
console.log('立即执行')
|
||||||
} else {
|
if (status) {
|
||||||
reject('failed');
|
resolve('success')
|
||||||
}
|
} else {
|
||||||
|
reject('failed')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var p1 = new Promise(test);
|
var p1 = new Promise(test);
|
||||||
p1
|
p1.then(function(msg){
|
||||||
.then(function(msg){
|
// 这里的代码是异步执行的
|
||||||
console.log("我是第一个回调函数:" + msg);
|
console.log("我是第一个回调函数:" + msg)
|
||||||
return msg;
|
return msg
|
||||||
})
|
})
|
||||||
.then(function(msg){
|
.then(function(msg){
|
||||||
console.log("我是第二个回调函数:" + msg);
|
console.log("我是第二个回调函数:" + msg)
|
||||||
})
|
})
|
||||||
.catch(console.error);
|
.catch(console.error)
|
||||||
```
|
```
|
||||||
当然上面这种方式只能适用于多重回调函数中只有一个参数的情况
|
当然上面这种方式只能适用于多重回调函数中只有一个参数的情况
|
||||||
如果要传多个参数
|
如果要传多个参数
|
||||||
|
|||||||
@ -13,54 +13,108 @@ categories:
|
|||||||
Promise的主要意义是在于解决多重回调的多层嵌套问题
|
Promise的主要意义是在于解决多重回调的多层嵌套问题
|
||||||
如果回调的嵌套层级太多 , 会造成代码可读性很差 , 难以维护
|
如果回调的嵌套层级太多 , 会造成代码可读性很差 , 难以维护
|
||||||
<!-- more -->
|
<!-- more -->
|
||||||
例如
|
如果我们要使用setTimeout来构造一个顺序异步执行的过程
|
||||||
|
需要这样做
|
||||||
```javascript
|
```javascript
|
||||||
var test = function(num, func) {
|
function test(num, func) {
|
||||||
console.log(num);
|
setTimeout(function(){
|
||||||
func(num);
|
console.log(num)
|
||||||
};
|
func(num)
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
test(1, function(a){
|
test(1, function(a){
|
||||||
test(2, function(b){
|
test(2, function(b){
|
||||||
test(3, function(c){
|
test(3, function(c){
|
||||||
console.log("回调成功");
|
console.log("回调成功")
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
```
|
```
|
||||||
使用Promise可以将上述的代码改造成线性的模式 , 可读性增强 , 同时也更便于调试
|
使用Promise可以将上述的代码改造成线性的模式 , 可读性增强 , 同时也更便于调试
|
||||||
```javascript
|
```javascript
|
||||||
var pro = new Promise(function(resolve, reject){
|
new Promise(function(resolve, reject){
|
||||||
resolve(1);
|
resolve(1)
|
||||||
}).then(function(val){
|
}).then(function(val){
|
||||||
console.log(val);
|
console.log(val)
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
resolve(2);
|
resolve(2)
|
||||||
});
|
})
|
||||||
}).then(function(val){
|
}).then(function(val){
|
||||||
console.log(val);
|
console.log(val)
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
resolve(3);
|
resolve(3)
|
||||||
});
|
})
|
||||||
}).then(function(val){
|
}).then(function(val){
|
||||||
console.log(val);
|
console.log(val)
|
||||||
});
|
})
|
||||||
```
|
```
|
||||||
让then方法的函数每次都是返回不同的Promise实例 , 再去指定这个实例的回调函数即可
|
让then方法的函数每次都是返回不同的Promise实例 , 再去指定这个实例的回调函数即可
|
||||||
|
|
||||||
并且对于Promise对象 , 它的回调执行是异步的
|
并且对于Promise对象 , 它对于resolve和reject的执行是异步的
|
||||||
例如 :
|
例如 :
|
||||||
```javascript
|
```javascript
|
||||||
new Promise(function(resolve, reject){
|
new Promise(function(resolve, reject){
|
||||||
resolve("AA");
|
console.log("AA");
|
||||||
|
resolve("BB");
|
||||||
}).then(function(msg){
|
}).then(function(msg){
|
||||||
console.log(msg);
|
console.log(msg);
|
||||||
});
|
});
|
||||||
console.log("BB");
|
console.log("CC");
|
||||||
/* output:
|
/* output:
|
||||||
BB
|
|
||||||
AA
|
AA
|
||||||
|
CC
|
||||||
|
BB
|
||||||
*/
|
*/
|
||||||
```
|
```
|
||||||
对于异步操作实现的原理 , 可以参考JS的事件驱动模型
|
|
||||||
JS引擎会将回调函数的执行加入到事件队列当中
|
---
|
||||||
从而实现在单线程的条件下 , 代码的异步执行
|
#### Promise.resolve 和 Promise.reject
|
||||||
|
`Promise.resolve`方法会返回一个Promise实例
|
||||||
|
分为下面几种情况
|
||||||
|
1. 参数是一个Promise实例
|
||||||
|
将不做任何修改, 直接返回这个Promise实例
|
||||||
|
|
||||||
|
2. 参数是一个thenable对象
|
||||||
|
thenable对象意思是这个对象当中带有then属性, 值是一个函数, 接收参数resolve和reject两个函数
|
||||||
|
```javascript
|
||||||
|
const p1 = Promise.resolve({
|
||||||
|
then: (resolve, reject) => {
|
||||||
|
resolve('异步回调执行')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 等价于如下写法
|
||||||
|
const p2 = new Promise((resolve, reject) => {
|
||||||
|
resolve('异步回调执行')
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 参数是不具有then方法的对象
|
||||||
|
```javascript
|
||||||
|
const p1 = Promise.resolve('Hello')
|
||||||
|
// 等价于如下写法
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
resolve('Hello')
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
4. 没有任何参数
|
||||||
|
```javascript
|
||||||
|
const p1 = Promise.resolve()
|
||||||
|
// 等价于如下写法
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
```
|
||||||
|
其实实际效果可以归为到第三类
|
||||||
|
|
||||||
|
---
|
||||||
|
`Promise.reject`方法就相对比较简单了
|
||||||
|
只有这一种情况
|
||||||
|
```javascript
|
||||||
|
Promise.reject('Error')
|
||||||
|
// 等价于如下写法
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
reject('Error')
|
||||||
|
})
|
||||||
|
```
|
||||||
|
不论传入什么参数, 都会传递给reject
|
||||||
Loading…
x
Reference in New Issue
Block a user