В чем разница между обещанием((разрешить,отклонить)=>{}) и обещанием(разрешить =>{})?
Как мы знаем, конструктор Promise принимает одну функцию исполнителя, которая имеет два параметра, которые мы используем для генерации случая успеха или случая неудачи. Сегодня я программировал, и я застрял, но позже я решил проблему, но я нашел одну вещь, которую нужно понять.
В чем разница между
new Promise(resolve => {
// resolve
});
И
new Promise((resolve,reject)=>{
// resolve
// reject
});
Можем ли мы так поступить?
new Promise(resolve => {
// resolve
}, reject => {
// reject
});
Примеры будут оценены более высоко. Спасибо!!!
4 ответа:
Это относится не только к обещаниям, но и к функциям обратного вызова.
new Promise((resolve) => {});
1 создает обещание, обратный вызов которого принимает только параметрresolve
. Невозможно вызвать функцию отклонения, которая в противном случае была бы предоставлена.2Вышеприведенные два примера демонстрируют, как работают позиционные параметры. Первый параметр в функция обратного вызова всегда является функцией разрешения, вторая-всегда функцией отклонения.
new Promise((resolve, reject) => {});
создает обещание, обратный вызов которого принимает оба параметра, включая один для отклонения.
new Promise((reject, resolve) => {});
создаст обещание, в котором вы можете разрешить сreject
и отклонить сresolve
.Вы можете
throw
в области функции обратного вызова илиresolve(Promise.reject())
вызвать отклонение:new Promise((resolve) => { throw new Error("42"); // or `resolve(Promise.reject(new Error("42")));` }) .catch(console.warn); // Prints warning “Error: "42"” in the console.
Нельзя использовать
new Promise((resolve) => {}, (reject) => {});
, так как конструкторPromise
принимает только один аргумент. Вторая функция обратного вызова будет просто проигнорирована.
1:
(resolve) => {}
есть, конечно, эквивалентноresolve => {}
. Но параметры функции стрелки на самом деле всегда требуют скобок. Простые и единичные параметры являются единственным исключением, где они могут быть опущены. Смотрите статью MDN о синтаксисе функции arrow .2: используя регулярную функцию,
new Promise(function(resolve){});
илиnew Promise(function(){});
вы можете получить доступ к любому аргументу с помощьюarguments[0]
(разрешить ) илиarguments[1]
(отклонить ).
Вы можете опустить
reject
, если вы точно знаете, что обещание никогда не может провалиться, например таймер. Все, что требует обработчика ошибок (http-запросы, файловый ввод-вывод и т. д.) потребуется обратный вызовreject
.
Функция стрелки, которую вы передаете, является обратным вызовом, срабатывающим при завершении асинхронной операции. Он принимает 2 аргумента, функцию, которая будет вызвана в случае успеха, (resolve) и функцию, которая будет вызвана в случае неудачи (reject).
В JS вам не нужно передавать все параметры функции обратного вызова. Если вы не планируете обрабатывать ошибки (вы должны обрабатывать!), вы можете опустить его.
Если вы передаете 1 парам, это считается разрешением fn.
Ну, забудьте об обещаниях, если какая-либо функция, имеющая один аргумент, вызывается с двумя аргументами, нет никаких проблем в качестве стандарта par JavaScript (и наоборот).
Теперь, в связи с вашим обещанием, обратный вызов, который вы передаете своему конструктору, будет вызван двумя аргументами (функцией решателя и отклонителем). Если вы создадите функцию, имеющую 1 аргумент, и передадите ее конструктору Promise, она просто будет вызвана 2 аргументами, так как у вас нет ссылки на второй аргумент. аргумент вы не можете использовать, что в любом случае он должен быть пользователем (как общий оператор, а не для обещания).
Вы все еще можете попробовать использовать
arguments
, Если вам все еще нужен второй аргумент, но с помощью функцииarrow
Вы не получите и этого. В этом случае лучше использовать обычныйfunction () {}
. В противном случае вы можете попытаться вернуть другое обещание явно с помощьюPromise.resolve
илиPromise.reject
И определенно последний с несколькими обратными вызовами в качестве аргументов для конструктора Promise не будет работать, потому что они разработаны так же, как один обратный вызов с 2 параметрами.