JS - как подключиться к успешным и ошибочным обратным вызовам из другого файла - PullRequest
0 голосов
/ 14 декабря 2018

Мой JS настроен следующим образом.

App1.js

function x(){
  thirdPartyLibrary.performAsyncTask((resultObject, errorObject) => {
    // This is a callback function, invoked when performAsyncTask is done.
    // I can handle resultObject and errorObject here.
  });
}

Допустим, у меня есть другие файлы как часть этого приложения.Каждый из них вызывает x () и вызывает свою собственную версию функции handleSuccess () или handleError () в зависимости от результатов вызова x ().

Как я могу структурировать вызов x () так, чтобы я мог этого добиться?Как будто я хочу «прослушать» результаты executeAsyncTask () из App1.js, но я не уверен, как это сделать.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Если вам нужно остаться с обратными вызовами (из-за очень старых клиентов JS или чего-либо еще), вы можете предоставить обратный вызов в качестве параметра для x:

function x(myCallback) {
  thirdPartyLibrary.performAsyncTask(myCallback);
}

// other file:
x((resultObject, errorObject) => {
  // handle just like before
});

Вы можете даже изменить его на два обратных вызовав зависимости от результата.В итоге будет вызван только один из ваших обратных вызовов:

function x(successCallback, errorCallback) {
  thirdPartyLibrary.performAsyncTask((resultObject, errorObject) => {
    if (errorObject) return errorCallback(errorObject);
    else return successCallback(resultObject);
  });
}

// other file:
x(
  function handleSuccess(resultObject) {
    // handle success
  },
  function handleError(errorObject) {
    // handle error
  }
);
0 голосов
/ 14 декабря 2018

Пусть x возвращает Promise, которое разрешается с resultObject, если ошибки нет, или отклоняется с errorObject, если есть ошибка.Затем абоненты x могут связывать .then с Promise для обработки успехов и .catch es для обработки сбоев:

function x(){
  return new Promise((resolve, reject) => {
    thirdPartyLibrary.performAsyncTask((resultObject, errorObject) => {
      if (errorObject) reject(errorObject);
      else resolve(resultObject);
    });
  });
}

x()
  .then(result => {
    // handle successful result
  })
  .catch(err => {
    // handle error
  });
...