Перейти к содержанию

Promise в битрикс

В Битрикс Promise отличается от стандартного.

В стандартном Promise в конструктор передаются функции resolve и reject, которые вызываются соответственно после успешного исполнения или возникновения ошибки.

В Битрикс эти методы не передаются. Вместо этого для успешного выполнения используется метод promise.fulfill, а для обработки ошибок - метод promise.reject.

Пример: промисификация для ajax

// промисификация нативным Promise
const promisifyAjax = (data) => {
  return new Promise((resolve, reject) => {
    ajax({
      data,
      success: response => resolve(response),
      error: error => reject(error)
    })
  });
}

// использование
promisifyAjax({ id: 1 })
  .then(response => console.log(response))
;

// промисификация BX Promise
const bxPromisifyAjax = (data) => {
  // контруктор не умеет принимать аргументы-функции
  const promise = new BX.Promise();
  // вместо resolve и reject надо вызвать методы fulfill либо reject с объекта-промиса
  ajax({
    data,
    success: response => promise.filfull(response),
    error: error => promise.reject(error)
  })
  return promise;
}
bxPromisifyAjax({ id: 1 })
  .then(response => console.log(response))
;

В стандартном промисе .then() всегда возвращает Promise, поэтому можно вызывать их по цепочке:

.then с нативным Promise
promisify().then().then().then();

В Битрикс, если .then() возвращает undefined, то цепочка не продолжится. Необходимо, чтобы метод возвращал что-то отличное от undefined. Например, можно вернуть null:

.then с BX.Promise
bxPromisify().then(() => null).then();