Как связать обещание с блоком then и catch - PullRequest
2 голосов
/ 11 июля 2019

Я пытаюсь объединить данные из запроса API вместе и хотел бы собрать обещания из двух блоков в третий then.

Шаблон выглядит следующим образом:

sql.connect(config.properties).then(pool => {
  return pool.request()
    .execute('stored_proc')
    .then(response => { res.send(response) })
    .catch(err => { res.send(err) })
    .then((response, err) => { someFunction(response, err) }) // bundle here
    .finally(() => sql.close())
})

Как я могу передать response и err во второй блок then для передачи в функцию?

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Я бы рекомендовал вызывать someFunction в двух местах, где эти значения действительно доступны:

return pool.request()
.execute('stored_proc')
.then(response => {
  res.send(response);
  someFunction(response, null);
})
.catch(err => {
  res.send(err);
  someFunction(null, err);
})
.finally(() => sql.close())

Однако, учитывая разницу между .then(…, …) и .then(…).catch(…)На самом деле я бы порекомендовал

return pool.request()
.execute('stored_proc')
.then(response => {
  res.send(response);
  someFunction(response, null);
}, err => {
  res.send(err);
  someFunction(null, err);
})
.finally(() => sql.close())

Теперь, если вы действительно хотите передать значения в следующий then обратный вызов, вы можете просто return их.Используйте массив для передачи двух значений:

return pool.request()
.execute('stored_proc')
.then(response => {
  res.send(response);
  return [response, null];
}, err => {
  res.send(err);
  return [null, err];
})
.then(([response, err]) => {
  someFunction(response, err);
})
.finally(() => sql.close())
0 голосов
/ 11 июля 2019

Используя async/await, который теперь включен в Node.js.

Вы можете сделать что-то вроде ->

sql.connect(config.properties).then(async pool => {
  try {
    let response = null; //let's set to null, in case it doesn't even get that far
    try {
      response = await pool.request().execute('stored_proc');
      res.send(response);
      someFunction(response, null);
    } catch (err) {
      res.send(err);
      someFunction(response, err);
    }
  } finally {
    sql.close();
  }
})

Преимущество в том, что мы можем держать закрытие наответ, я также установил его равным нулю, потому что в теории это может даже не дойти до получения ответа.

Что делает async/await приятным, это то, что вы можете вернуться к мысли вsync, но код все еще выполняется async, поэтому все обычные команды try / catch / finally работают так, как вы ожидаете, для циклов работают так, как вы себе представляете и т. д. Просто будьте осторожны с Array.forEach, и все, что нужнообратные вызовы, так как это может работать не так, как вы ожидаете.

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