Как инкапсулировать ввод-вывод и подобные обещания - PullRequest
0 голосов
/ 05 декабря 2018

Существует много операций ввода-вывода - запросы к другим серверам, доступ к базе данных, доступ к файлам - которые являются или должны быть обещаниями.Однако для инкапсуляции вызовов более высокого уровня, которые могут выполнять запросы к серверу (например, в Google recaptcha или Cloudinary), вызовы базы данных (например, PostgreSQL, Mongo, ReDis) или просто чтение файла.

В идеале этоформат:

functionCall()
.then(FC1)
.then(FC2)
.catch()

Вызывающему родителю не нужно знать о внутренних особенностях вызова, или, следовательно, или предложениях catch.Они должны быть, насколько я понимаю, похожи на:

highLevelFuncionCall()
.then(()=>{
   functionCall() //and all its then/catch clauses
}
.then(HLFC1)
.then(HLFC2)
.catch()

Однако, похоже, это не сработает.Обработка переходит к HLFC1 без ожидания FC1 и FC2, даже если сначала требуется их обработка.

Как это можно структурировать, чтобы зависимые обещания были невидимы для вызывающего абонента более высокого уровня?

Спасибо,

Дэвид

1 Ответ

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

Если я правильно понимаю (основываясь на комментариях), это должно имитировать описанные сценарии:

function getResolved() {
  return new Promise((resolve) => window.setTimeout(resolve, 500, 'ok'));
}

function getRejected() {
  return new Promise((resolve, reject) => window.setTimeout(reject, 500, 'error!'));
}

function progressChain(functionCall) {
  return getResolved() // HLF1
  .then(() => {
    return functionCall() // functionCall with then/catch
    .then(getResolved)
    .then(() => console.log('functionCall resolved'))
    .catch((err) => { // FCC
      console.log('Argh!! functionCall failed!');
      throw err; // rethrow err to chain
    });
  })
  .then(getResolved) // HLF2
  .then((res) => console.log(res)) // HLF3
  .catch((err) => console.log(err)); // HLC
}

// both resolved and rejected scenario (synced)
progressChain(getResolved)
.then(() => progressChain(getRejected))
...