Обещаю не стрелять по всем функциям - PullRequest
0 голосов
/ 10 мая 2018

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

Чтобы проверить это, я создал следующие три функции:

this.functionResolve = (data) => console.log('resolved: ' + data)
this.functionError = (data) => console.log('error: ' + data)
this.functionSucess = (data) => console.log('success: ' + data)

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

PagSeguroDirectPayment.getBrand({ cardBin: "000000", complete: this.functionResolve, success: this.functionSucess, error: this.functionError });

Чтобы преобразовать это в обещание, я получил следующее:

this.promisifyCallback = function() {
    return new Promise((resolve, _success, _error) => {
        PagSeguroDirectPayment.getBrand({
            cardBin: "000000",
            complete: resolve,
            success: _success,
            error: _error
        });
    });
}

Когда язвоните this.promisifyCallback().then(this.functionResolve, this.functionSucess, this.functionError), отображается только журнал разрешений.

В случае, если кто-либо хочет проверить, объект PagSeguroDirectPayment доступен по адресу: PagSeguro API

1 Ответ

0 голосов
/ 10 мая 2018

Функция исполнителя обещаний (обратный вызов, который вы передаете new Promise) получает только два аргумента, а не три: resolve (для разрешения проекта) и reject (для отклонения). (Вы можете называть их как угодно; это обычные имена для использования.)

Это означает, что с вашим текущим кодом:

  • Вы решите, когдазапрос завершен, независимо от того, сработал он или нет, из-за success: resolve
  • Вы отклоните запрос при успешном выполнении (из-за success: _success) (если только этот API не вызовет сначала обработчик complete;обещание может быть разрешено или отклонено только один раз)
  • Ваш параметр _error всегда будет undefined

Вместо этого:

this.promisifyCallback = function() {
    return new Promise((resolve, reject) => {
        PagSeguroDirectPayment.getBrand({
            cardBin: "035138",
            //complete: ,
            success: resolve,
            error: reject
        });
    });
}

Когда Используя обещание , вы можете получить поведение complete, используя .finally (в современных средах или с полифилом - finally был добавлен сравнительно недавно).

Когда я звоню this.promisifyCallback().then(this.functionResolve, this.functionSucess, this.functionError), появляется только журнал разрешения.

Вы можете использовать его так:

this.promisifyCallback()
    .then(this.functionSucess, this.functionError)
    .finally(this.functionResolve); // See ¹

или

this.promisifyCallback()
    .then(this.functionSucess)
    .catch(this.functionError)
    .finally(this.functionResolve); // See ¹

¹ «Решить» на языке Promise означает «завершить успешно» (иногда также используется «выполнить»).«Отклонить» означает неудачу.«Урегулировать» означает разрешить или отклонить.

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