es6解讀 - async函式
- async函式返回promise物件
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
由於async函式返回的是 Promise 物件,可以作為await命令的引數。所以,上面的例子也可以寫成
下面的形式:
async function timeout(ms) {
await new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
async 函式的實現原理
async 函式的實現原理,就是將 Generator 函式和自動執行器,包裝在一個函式裡。
async function fn(args) {
// ...
}
// 等同於
function fn(args) {
return spawn(function* () {
// ...
});
}
所有的async函式都可以寫成上面的第二種形式,其中的spawn函式就是自動執行器。
下面給出spawn函式的實現,基本就是前文自動執行器的翻版。
function spawn(genF) {
return new Promise(function(resolve, reject) {
const gen = genF();
function step(nextF) {
let next;
try {
next = nextF();
} catch(e) {
return reject(e);
}
if(next.done) {
return resolve(next.value);
}
Promise.resolve(next.value).then(function(v) {
step(function() { return gen.next(v); });
}, function(e) {
step(function() { return gen.throw(e); });
});
}
step(function() { return gen.next(undefined); });
});
}
非同步遍歷
const asyncIterable = createAsyncIterable(['a', 'b']);
const asyncIterator = asyncIterable[Symbol.asyncIterator]();
asyncIterator
.next()
.then(iterResult1 => {
console.log(iterResult1); // { value: 'a', done: false }
return asyncIterator.next();
})
.then(iterResult2 => {
console.log(iterResult2); // { value: 'b', done: false }
return asyncIterator.next();
})
.then(iterResult3 => {
console.log(iterResult3); // { value: undefined, done: true }
});
async promise await執行順序
- Promise優先於setTimeout巨集任務。所以,setTimeout回撥會在最後執行。
- Promise一旦被定義,就會立即執行。
- Promise的reject和resolve是非同步執行的回撥。所以,resolve()會被放到回撥佇列中,在主函式執行完和setTimeout前呼叫。
- await執行完後,會讓出執行緒。async標記的函式會返回一個Promise物件
async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(function(){
console.log('setTimeout')
},0)
async1();
new Promise(function(resolve){
console.log('promise1')
resolve();
}).then(function(){
console.log('promise2')
})
console.log('script end')
上述,在Chrome 66和node v10中,正確輸出是:
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout
相關文章
- async函式函式
- async函式,瞭解一下函式
- async函式解析函式
- 重讀《深入理解ES6》—— 函式函式
- ES6-Generator 函式 和 async 函式函式
- async函式使用場景函式
- async 函式的實現原理函式
- async函式學習筆記。函式筆記
- generator函式與async/await函式AI
- ES6 Generator函式函式
- 非同步操作系列之Generator函式與Async函式非同步函式
- 重讀 ES6 - async+await 同步/非同步方案AI非同步
- 如何更好的編寫async函式函式
- async 函式的含義和用法函式
- ES6函式比對ES5函式函式
- ES6 函式相關函式
- ES6箭頭函式函式
- ES6函式引數函式
- C語言解讀assert函式C語言函式
- ES6 Promise 應用: 回撥函式方法封裝成 Promise + async/await 同步化Promise函式封裝AI
- [面試專題]ES6之箭頭函式詳解面試函式
- ES6 Generator 函式介紹函式
- 深入理解ES6 ---- 函式函式
- 【深入淺出ES6】函式函式
- ES6語法(二) 函式函式
- 前端進階-ES6函式前端函式
- JavaScript(ES6)—箭頭函式JavaScript函式
- ES6函式與Lambda演算函式
- ES6 - async&awaitAI
- vue原始碼解讀-建構函式Vue原始碼函式
- 瞭解ES6中的模板字串的標籤函式字串函式
- es6學習_箭頭函式解決this指向問題函式
- async、await和generator函式內部原理AI函式
- async await函式效能與Promise併發AI函式Promise
- 前端-JavaScript非同步程式設計async函式前端JavaScript非同步程式設計函式
- 用 Async 函式簡化非同步程式碼函式非同步
- 【C++】【原始碼解讀】std::is_same函式原始碼解讀C++原始碼函式
- ES6之Array.includes()函式函式