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

Я использую канал для проверки ввода для входа в систему, и я хотел бы разорвать и вернуть текущие данные, если это возможно.Возможно ли даже обрывать и возвращать данные из reduce?

Мой текущий пример кода:

const pipe = (...fns) => fns.reduce((f, g) => (obj) => g(f(obj)))

pipe(
  (obj) => {
    console.log('fn1', obj)
    return { ...obj, ...(!!obj.name || { error: ['NAME_IS_FALSEY'] })} 
  },
  (obj) => {
    // if ((obj || {}).error ) return obj
    console.log('[fn2]', obj)
    return { 
      ...obj,
      ...(
        !!obj.password ||
    obj.error ?
      { error: [...obj.error, 'PASSWORD_IS_FALSEY'] } :
          { error: 'PASSWORD_IS_FALSEY' }
      )
    }   
  },
  (obj) => console.log('[fn3 etc...]', obj)
)({
  name: '',
  password: '',
})

Может быть, я могу обернуть все в new Promise и разрешить на полпути черезредуктор?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Если каждый шаг в вашем канале возвращает объект Maybe, вы можете использовать функцию pipeK из Ramda, чтобы создать канал на основе композиции Kleisli, который выполняется до тех пор, пока один из шагов не вернет Nothing.Вы можете получить реализацию из пакета sanctuary-возможно.

0 голосов
/ 28 октября 2018

Вот пример рекурсивного канала, который разрывает цепочку вызовов, как только текущее значение не соответствует предикату:

const pipeWhile = pred => (f, ...fs) => x =>
  pred(x) && f 
    ? pipeWhile (pred) (...fs) (f(x))
    : x;

Может быть легче прочитать ведение, если оно написано как обычное while или for loop.

Вот это используется с предоставленным вами примером:

const pipeWhile = pred => (f, ...fs) => x =>
  pred(x) && f 
    ? pipeWhile (pred) (...fs) (f(x))
    : x;
    

const noError = x => !x.hasOwnProperty("error");
const rule = (error, pred) => x => pred(x) 
  ? x : { ...x, error: [error] }

const validation = pipeWhile(noError)(
  rule("NAME_IS_FALSEY", obj => !!obj.name),
  rule("PASSWORD_IS_FALSEY", obj => !!obj.password)
);

console.log(
  validation({
    name: '',
    password: '',
  }),
  validation({
    name: 'Jane',
    password: '',
  }),
    validation({
    name: 'Jane',
    password: 'PA$$W0RD',
  })
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...