個人理解promise是將異步處理轉換爲同步處理的一種解決方案,能夠經過下面代碼理解下。javascript
var sleep = function (index) { setTimeout(() => { // 模擬異步處理 console.log(`sleep ${index}`) }, 500 * index); } var fn = function () { console.log('start') sleep(1); // 這裏是異步處理函數 console.log('end') } fn()
咱們指望的結果是java
start sleep 1 end
但由於sleep是異步處理(延遲了n秒後才執行),最後的執行結果是promise
start end sleep `
如今使用promise改造下,將sleep函數返回一個Promise,而後使用調用這個Promise對象的then方法。異步
var sleep = function (index) { return new Promise(function (resolve, reject) { setTimeout(() => { console.log(`sleep ${index}`) resolve() }, 500 * index); }) } var fn = function () { console.log('start') sleep(1).then(() => { console.log('end') }); } fn()
程序執行結果與預期結果一致。
async
resolve能夠帶一些參數,這些參數能夠在then中訪問,因此返回結果能夠經過resolve返回。函數
var sleep = function (index) { return new Promise(function (resolve, reject) { setTimeout(() => { const result = `sleep ${index}` resolve(result) }, 500 * index); }) } var fn = function () { console.log('start') sleep(1).then((info) => { console.log(info) console.log('end') }); } fn()
函數執行結果與預期結果一致。spa
await的意思是阻塞,await 必須放在 以 async 裝飾的函數中,以下面形式code
async function fn (){ await promisefn(); }
如今將上面使用then的promosi改形成使用await形式。對象
var sleep = function (index) { return new Promise(function (resolve, reject) { setTimeout(() => { const result = `sleep ${index}` resolve(result) }, 500 * index); }) } var fn = async function () { console.log('start') const info = await sleep(1) console.log(info) console.log('end') } fn()