В чем разница между обещанием((разрешить,отклонить)=>{}) и обещанием(разрешить =>{})?


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

В чем разница между

new Promise(resolve => {

    // resolve

});

И

new Promise((resolve,reject)=>{

    // resolve
    // reject

});

Можем ли мы так поступить?

new Promise(resolve => {

    // resolve

}, reject => {

    // reject

});

Примеры будут оценены более высоко. Спасибо!!!

4 3

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 параметрами.