Простая реализация базового метода Promise

внешний интерфейс JavaScript
Простая реализация базового метода Promise

«Это 15-й день моего участия в первом испытании обновлений 2022 года. Подробную информацию о мероприятии см.:Вызов первого обновления 2022 г."

предисловие

Промис — крайне распространенная концепция на фронтенд-интервью и работе, а рукописная реализация его различных методов тоже очень востребована.Сегодня я подытожу простую реализацию основных методов промиса.

поймать () метод

catchметод правильныйthenИнкапсуляция метода, используемая только для полученияreject(reason)сообщение об ошибке в .

Потому чтоthenметодonRejectedПараметр является необязательным, в противном случае сообщение об ошибке будет передаваться последовательно до тех пор, пока не будетonRejectedфункция пока не получена, так что пишитеpromiseПри объединении вызововthenметод не прошелonRejectedфункция, просто добавьте один в концеcatch()Вот именно, чтобы в цепочкеpromiseВозникающие ошибки будутcatchзахвачен.

catch(onRejected) {
	return this.then(null, onRejected);
}

метод done()

catchсуществуетpromiseВызывается в конце связанного вызова для перехвата сообщений об ошибках в цепочке, ноcatchОшибки также могут возникать внутри методов, поэтому некоторыеpromiseДобавил метод в реализациюdone.

doneэквивалентно предоставлению безошибочногоcatchметод и больше не возвращаетpromise, обычно используется для завершенияpromiseцепь.

done() {
    this.catch(reason => {
        console.log('done', reason);
        throw reason;
    });
}

наконец() метод

finallyметод для любогоresolveещеreject,finallФункции параметров y будут выполнены.

finally(fn) {
    return this.then(value => {
        fn();
        return value;
    }, reason => {
        fn();
        throw reason;
    });
};

Метод Promise.all()

Promise.allметод получаетpromiseмассив, возвращает новыйpromise2, одновременно выполняет весь массивpromise,всеpromiseстатусresolvedчас,promise2Статусresolvedи вернуть всеpromiseрезультаты, порядок результатов иpromiseМассивы в том же порядке. если естьpromiseдляrejectedгосударство, весьpromise2Войтиrejectedусловие.

static all(promiseList) {
    return new Promise((resolve, reject) => {
        const result = [];
        let i = 0;
        for (const p of promiseList) {
            p.then(value => {
                result[i] = value;
                if (result.length === promiseList.length) {
                    resolve(result);
                }
            }, reject);
            i++;
        }
    });
}

Метод Promise.race()

Promise.raceметод получаетpromiseмассив, возвращает новыйpromise2, выполнить последовательность в массивеpromise, Eстьpromiseстатус в порядке,promise2Состояние определено, и так же, как этоpromiseстатус такой же.

static race(promiseList) {
    return new Promise((resolve, reject) => {
        for (const p of promiseList) {
            p.then((value) => {
                resolve(value);
            }, reject);
        }
    });
}

Promise.resolve() и Promise.reject()

Promise.resolveсоздатьrejectedидеальноpromise,Promise.rejectсоздатьrejectedне удалосьpromise.

static resolve(value) {
    let promise;

    promise = new Promise((resolve, reject) => {
        this.resolvePromise(promise, value, resolve, reject);
    });

    return promise;
}

static reject(reason) {
    return new Promise((resolve, reject) => {
        reject(reason);
    });
}

Суммировать

Это широко используемые методы,PromiseТакже существует множество методов расширения, которые здесь не показаны по одному, в основном все они правильные.thenДальнейшая инкапсуляция методов, еслиthenС методом проблем нет, можно положиться на другие методыthenреализация метода.

~

Эта статья окончена, спасибо за чтение!

~

Получайте интересные знания, встречайте интересных друзей и формируйте интересные души!

Привет всем, я〖Программирование самадхи〗авторКороль-затворник, мой официальный аккаунт "Программирование самадхи』, пожалуйста, обратите внимание, я надеюсь, что вы можете дать мне больше советов!