Почему параметр разрешения указывается первым в JavaScript Promises? - PullRequest
0 голосов
/ 06 января 2020

я учился javascript Обещания. Мне показалось, что JavaScript Promise работает аналогично функции callback.

В функции callback мы обычно используем параметр first в качестве error и секунда как success.

Тогда почему в JavaScript Promise параметры приходят по-другому? Первый - это success, а второй - error? Это как противоположность структуры параметров callback, и это меня смущает.

Это не проблема, но я хотел бы получить объяснение этому. Если я не прав, то чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вы путаете JavaScript обещания обратного вызова с шаблонами проектирования обратного вызова из API стандартной библиотеки Node. Они не одинаковы.

Цель обещаний JavaScript состоит в том, чтобы иметь дело с долго выполняющимися процессами, где нам нужна некоторая способность выяснить, когда процесс завершится, чтобы продолжить выполнение следующего фрагмента кода.

Так что в Обратные вызовы Обещаний, о которых вы узнаете, существуют в трех состояниях: неразрешено , разрешено и отклонено .

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

Выше не является целью и функцией обратных вызовов стандартной библиотеки Node, которые используются внутри функций, которые являются частью API файловой системы. Эти конкретные функции, такие как read(), readdir() и т. Д., Имеют три аргумента, которые могут быть переданы ему, один необязательный, третий - обратный вызов, о котором вы говорите.

Шаблон для стандарта Node Обратные вызовы библиотеки при работе с функциями файловой системы должны предлагать два аргумента в этом аргументе обратного вызова, первый из которых всегда является объектом ошибки, err, теперь не гарантируется, что ошибка произойдет, вместо этого, если что-то пойдет не так при открытии В каком-то файле (файлах) узел будет вызывать функцию обратного вызова с первым аргументом объекта err.

Если ошибки нет, то первый аргумент вместо этого будет нулевым.

Теперь вторым аргументом функции обратного вызова будут данные, которые я на самом деле ищу.

https://nodejs.org/api/fs.html#fs_file_system

Видите ли, два разных обратных вызова, о которых вы говорите. Надеюсь, это поможет.

1 голос
/ 06 января 2020

Вы, очевидно, говорите о функции исполнителя Promise (которую вы передаете new Promise(...)). Это просто совершенно другой тип обратного вызова, и он действительно не имеет ничего общего со стандартным node.js обратным вызовом.

Функция исполнителя обещаний передает вам две отдельные функции, которые вы можете вызвать позже. Ни одна из них не является ошибкой. Если у вас действительно есть ошибка, вы вызываете reject(err) и передаете ей ошибку в качестве первого аргумента.

Другое место, где передаются две вещи, это обработчик .then(), где вы можете передать оба разрешения. обработчик и обработчик отклонения. Опять же, это совершенно другая вещь. Вы передаете ему две ссылки на функции, и инфраструктура обещания будет решать, какой обратный вызов передать. Когда он вызывает эти обратные вызовы, он передает аргумент в качестве первого аргумента.

Вот два различных элемента обратного вызова в обещаниях:

// promise executor function
let p = new Promise((resolve, reject) => {
    // this is passing to your callback two function references.
    // there's no error at this point.
    // you decide which function to call in your asynchronous operation
});

// then handler
somePromise.then(resolveData => {
    // this callback gets called when your promise resolves
    // it is known there is no error here, so no need to pass an err parameter
}, rejectErr => {
    // this callback gets called when your promise is rejected
    // the error is passed as the first argument
    // this callback is optional
});

Есть также .catch() и .finally() обработчики, но они работают аналогично, принимая один обратный вызов.

Имейте в виду, что шаблон:

 p.then(successHandler, errorHandler)

не передает вам ошибку в качестве второго аргумента. Вы передаете ему две ссылки на функции, и одна из них будет вызываться как позже. Таким образом, это не похоже на стандартный nodejs асинхронный обратный вызов, как fs.readFile(). Он имеет совершенно другое назначение и работает по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...