В чем разница между обещанием((разрешить,отклонить)=>{}) и обещанием(разрешить =>{})?
Как мы знаем, конструктор 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 параметрами.