ES 6を深く理解する——Promiseと非同期プログラミング
15574 ワード
ES 6を深く理解する——Promiseと非同期プログラミング
記事の目次 ES 6——Promiseと非同期プログラミング を深く理解する.背景知識 Promise基礎知識 グローバルPromise拒否処理 直列Promise は、複数のPromise に応答する. Promiseから を継承します. Promiseの非同期タスクに基づいて を実行する.
背景知識
JavaScriptはシングルスレッドです.
同じ時刻にコードブロックを実行するだけです.
イベントモデル
Eventループはタスクキューのタスクを実行します.
コールバックモード
関数をパラメータとして非同期関数に渡し、非同期関数を実行し終わったら、タスクの列の最後に新しいタスクを追加します.タスクの変更には、コールバック関数と対応するパラメータが含まれます.
逆転地獄に陥りやすい
Promise基礎知識
ライフサイクルペンディング実行中 fulfilled非同期動作成功(完了) レジェクトの非同期動作に失敗しました.拒否されました. すべてのPromiseにはthen方法があります.二つのパラメータを受信します.最初はPromiseの状態がfulfilledであるときに呼び出す関数です.二つ目はPromiseの状態がrejectであるときに呼び出す関数です.(拒否関数)
処理済みのPromiseを作成します. Promsie.resove()方法は一つのパラメータだけを受信して一つの完了状態のPromiseに戻ります.つまりタスクの編成過程はありません.そして、Promiseに複数の完了処理プログラムを追加して、値を得る必要があります.
タスクのキューに新しいタスクを追加し、遅延を指定して実行します.タスク編成といいます.set Timeout、set Intervalのような関数
Promise.reject()と同じで、作成されたのは拒否されたPromise であるという違いがあります.
捕獲エラー
Promiseが論争している問題:処理手順を拒否していない場合、Promiseを拒否すれば、失敗を提示しない.
Node.js環境の拒否処理
直列Promise
Promiseチェーンの戻り値は、returnで次のPromiseに戻ります.
reolveのreturnは次のPromise.reolveに戻ります.
rejectの中のreturnは次のPromise.rejectに戻ります.
Promise.all()
Promise.race()
Promise.race()メソッドに伝えられたPromiseが選挙を行います.どのPromise状態が先に完成して、どの状態に戻りますか?
Promiseから引き継ぐ
Promiseによる非同期タスクの実行
TODO:
結び目
![image-20190619211946064](/Users/qingweicen/Library/Appliplication Support/typort-inger-mages/image-20190619211946064.png)
記事の目次
背景知識
JavaScriptはシングルスレッドです.
同じ時刻にコードブロックを実行するだけです.
イベントモデル
Eventループはタスクキューのタスクを実行します.
コールバックモード
関数をパラメータとして非同期関数に渡し、非同期関数を実行し終わったら、タスクの列の最後に新しいタスクを追加します.タスクの変更には、コールバック関数と対応するパラメータが含まれます.
逆転地獄に陥りやすい
Promise基礎知識
ライフサイクル
let promise = readFile('example.txt')
promise.then(function(contents) {
//
})
promise.then(function(contents) {
//
}, function(err) {
//
})
promise.then(null, function(err){
//
})
Promiseはチェーン式で呼び出すことができます.Promiseが完了したら、新しいPromiseオブジェクトに戻ります.チェーン式で呼び出すことができます.処理済みのPromiseを作成します.
タスクのキューに新しいタスクを追加し、遅延を指定して実行します.タスク編成といいます.set Timeout、set Intervalのような関数
捕獲エラー
let promise = new Promise(function(resolve, reject) {
throw new Error('Expection')
})
promise.catch(function(err){
console.log(err.message) // Expection
})
グローバルPromise拒否処理Promiseが論争している問題:処理手順を拒否していない場合、Promiseを拒否すれば、失敗を提示しない.
Node.js環境の拒否処理
直列Promise
Promiseチェーンの戻り値は、returnで次のPromiseに戻ります.
reolveのreturnは次のPromise.reolveに戻ります.
rejectの中のreturnは次のPromise.rejectに戻ります.
let p1 = new Promise(function(resolve, reject) {
resolve(42)
})
p1.then(function(value) {
console.log(value) // 42
return value + 1
}).then(function(value) {
console.log(value) // 43
})
複数のPromiseに対応Promise.all()
let p1 = new Promise((resolve, reject) => {
resolve(1)
})
let p2 = new Promise((resolve, reject) => {
resolve(2)
})
let p3 = new Promise((resolve, reject) => {
resolve(3)
})
let p4 = Promise.all([p1, p2, p3])
p4.then((value) => {
console.log(Array.isArray(value)) // true
console.log(value[0]) // 1
console.log(value[1]) // 2
console.log(value[3]) // 3
})
すべてのPromiseが実行に成功してから戻ってきたという意味で、Promiseが失敗したというPromiseデータが入ってきました.帰った結果もデータです.結果はパラメータの着信順に対応します.Promise.race()
Promise.race()メソッドに伝えられたPromiseが選挙を行います.どのPromise状態が先に完成して、どの状態に戻りますか?
Promiseから引き継ぐ
class MyPromise extends Promise {
//
success(resolve, reject) {
return this.then(resolve, reject)
}
fail(reject) {
return this.then.catch(reject)
}
}
let promise = new MyPromise(function(resolve, reject) {
resolve(42)
})
promise.then(function(value) {
console.log(value) // 42
}).catch(function(value) {
console.log(value)
})
多くの第三者クラスがPromiseを継承することによって実現される.wx.request({
method: 'GET',
url: 'mp.wx.com',
success(res) {
},
fail(err) {
}
})
実は内部はPromiseを包装しました.Promiseによる非同期タスクの実行
TODO:
結び目
![image-20190619211946064](/Users/qingweicen/Library/Appliplication Support/typort-inger-mages/image-20190619211946064.png)