Как получить результаты ошибки из обещания тогда одновременно - PullRequest
0 голосов
/ 09 мая 2019

В конце обещания я хочу вызвать обратный вызов, который ожидает параметры err и results.вот так:

function callback(err, results) {
  console.log("error", err);
  console.log("result", results);
}

function async() {
  return Promise.reject({"undefined": true});
}

// what i want
// async().then((err, results) => callback(err, results));
// what works
async().then(results => (), err => ());

Но обещание так не работает.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Слово предостережения (как усвоено из опыта): будьте осторожны при смешивании обещаний и обратных вызовов. Это может сделать вещи позже.

Однако, чтобы получить в точности то, что вы просите, вы можете разрешить асинхронную функцию с массивом, а затем использовать деструктуризацию массива для передачи (иногда называемой "распространением") аргументов в ваш обратный вызов: (Разрушение объекта, как показано в другом ответе, также является разумным вариантом)

function callback(err, results) {
  console.log("error: ", err);
  console.log("result: ", results);
}

function async() {
  return Promise.resolve(["your errors", "your results" ]);
}

async().then(([error, results]) => callback(error, results));

Это делает то, что вы хотите, но важно отметить, какие проблемы могут возникнуть с этим кодом. Функция async() должна будет «нарушать правила» с цепочкой обещаний, разрешая обещание с ошибкой. (Либо «устранить ошибку» и / или «отклонить хорошие результаты»). Кроме того, порядок этого массива имеет значение. Даже если это объект, простые вещи, такие как правильное написание свойств объекта (т. Е. «Err» prop против «error»), могут вызвать проблемы.

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

Однако, если используются только обещания , то код можно немного очистить следующим образом:

function async(){
  var err = 'sad face'; // Play with these vars to see what happens
  var results = 123;
  if( err ){
    return Promise.reject(err);
  } else {
    return Promise.resolve(results);
  }
}

async()
.then((resp) => { console.log(resp) /* Work with resp, no conditionals needed :) Merrily proceed with your remaining code */  })
.catch((err) => { console.error(err)/* Err occurred, handle it here */ })
0 голосов
/ 09 мая 2019

Вы можете попробовать отклонить объект с двумя свойствами error и results.Затем используйте деструктуризацию и назовите ваш callback, например:

function callback(err, results) {
  console.log("error: ", err);
  console.log("result: ", results);
}

function async() {
  return Promise.reject({error: "your errors", results: "your results" });
}

async().catch(({error, results}) => callback(error, results));

Но помните, что resolve для ваших результатов успеха и reject для ваших ошибок.

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