Promiseを理解する
3559 ワード
promise規範原理と実現
三つの状態ペンディング準備 fulfilled成功 レジェクト失敗 二つの過程
(不可逆) pending->fulfilled pending->reject 一つの方法 then他はすべてthenの派生方法です.
Promiseデータ構造 new Promiseは同期実行 に属する. setTimeoutは、非同期スレッド を開く.順序0 1 4 Promiseのパラメータは、 を実行する関数である. Promiseのパラメータ関数のパラメータは、reolve rejectも関数です. レスリング作用 promise定義で呼び出し、着信成功結果 PromiseStateの状態を変更すると、fulfilled となります. PromiseResoult値 を設定します.
リジェクトの役割 promise定義で呼び出し、着信失敗の原因 PromiseStateの状態を変更すると、reject となります. PromiseResoult値 を設定します.
then方法 は、傍受関数をキュー に追加する.は、新たなプロモーション を返します.
プロミスの本質
生産者の消費パターンは、new promiseとthenの生産リフォームで消費を提供し、then catch finally;チェーン式の呼び出し方式を達成し、リベート地獄の目的を改善する.
簡単に実現する
三つの状態
(不可逆)
Promiseデータ構造
{
[[PromiseState]]: "fulfilled", //
[[PromiseResult]]: 1 //
}
Promise Demo運行説明const p = new Promise(function (resolve, reject) {
console.log(0);
setTimeout(() => {
const number = parseInt(Math.random() * 100);
const isOdd = number % 2;
if (isOdd) {
resolve(number);
} else {
reject(0);
}
}, 2000);
});
console.log(1);
p.then((data) => {
console.log(2);
}).catch((err) => {
console.log(3);
});
console.log(4);
プロミスの本質
生産者の消費パターンは、new promiseとthenの生産リフォームで消費を提供し、then catch finally;チェーン式の呼び出し方式を達成し、リベート地獄の目的を改善する.
簡単に実現する
const PROMISE_STATE_ENUM = {
PEDDING: "pendding",
FULFILLED: "fulfilled", //
REJECTED: "rejected", //
};
class MyPromise {
callbacks = []; // ? ? ? promise.All
constructor(fn) {
this.state = PROMISE_STATE_ENUM.PEDDING;
this.result = void 0;
// console.log(" ");
fn(
function resolve(data) {
if (this.state === PROMISE_STATE_ENUM.PEDDING) {
this.state = PROMISE_STATE_ENUM.FULFILLED;
this.result = data;
this.callbacks.map((fn) => {
fn(this.result);
});
}
}.bind(this),
function reject() {
this.state = PROMISE_STATE_ENUM.REJECTED;
return this;
}.bind(this)
);
}
then(onFulfilled, onRejected) {
const self = this;
let promise2;
if (this.state === PROMISE_STATE_ENUM.PEDDING) {
promise2 = new MyPromise(function (resolve, reject) {
self.callbacks.push(() => {
// setTimeout(function () {
let x = onFulfilled(self.result);
resolve(x);
// });
});
});
}
if (this.state === PROMISE_STATE_ENUM.FULFILLED) {
console.log("getdata");
onFulfilled(this.result);
}
if (this.state === PROMISE_STATE_ENUM.REJECTED) {
onRejected(this.result);
}
return promise2;
}
catch(onRejected) {
this.then(null, onRejected)
}
finally() {}
static all() {}
static race() {}
static allSettled() {}
static any() {}
static resolve(a) {
return a;
}
static reject() {}
}
const p = new MyPromise(function (resolve, reject) {
setTimeout(() => {
if (1) {
resolve("should data 123");
} else {
reject("error");
}
}, 300);
});
// console.dir(MyPromise);
// console.log(p, "p");
const p1 = p.then(
(resolve) => {
// console.log(resolve, ": then 1");
return 555
},
(error) => {
console.log(error);
}
);
// console.log(p1, "p1");
p1.then((data) => {
// console.log(data, ": then 2");
});
// console.log(p, "p2");