[TOC]
* * * * *
> 異步執行代碼的一種解決方案

### 1.Promise實例的幾種狀態:
~~~
1. pending: 初始狀態,既不是成功,也不是失敗狀態。
2. fulfilled: 意味著操作成功完成。
3. rejected: 意味著操作失敗。
~~~
* * * * *
### 2. 最常用的實現
~~~
var pro0=new Promise(function(resolve, reject) {
console.log('開始定義 pro0');
var pro1=new Promise(function(resolve, reject) {
console.log('開始定義 pro1');
resolve(1);
});
setTimeout(function() {
console.log('setTimeout回調函數執行');
resolve(0);
}, 2000);
//resolve(2);
/*
假如這里有個 resolve(2),那么 pro0 的狀態就會被改變,
且改變之后不會再變,那么 setTimeout 里的 resolve 就不再起作用了
*/
pro1.then(function(value) {
console.log('pro1 fulfilled',value);
});
});
pro0.then(function(value) {
console.log('pro0 fulfilled',value);
});
pro0.catch(function(e) {
console.log('pro0 rejected',e);
});
console.log('代碼定義end');
~~~
a. 正常執行:

b. 提前變狀態:

* * * * *
### 3. 鏈式調用
~~~
Promise.prototype.then 和 Promise.prototype.catch 方法
返回 Promise 對象, 所以它們可以被鏈式調用。
~~~

~~~
這里是模擬了鏈式調用,用同步代碼,真實情況中應該是異步代碼
job1.then(job2).then(job3).catch(handleError);
其中,job1、job2和job3都是Promise對象。
function job0(input) {
return new Promise(function(resolve, reject) {
let result=input+1;
console.log('值+1:',result);
resolve(result);
})
}
function job1(input) {
return new Promise(function(resolve, reject) {
let result=input*2;
console.log('值*2:',result);
resolve(result);
})
}
function job2(input) {
return new Promise(function(resolve, reject) {
let result=input*input;
console.log('值的平方:',result);
resolve(result);
})
}
function done(input) {
console.log('原始值:',input);
job0(input)
.then(job1)
.then(job2);
}
~~~
執行結果為:
