переход от data.task к народной сказке при обработке отказа - PullRequest
0 голосов
/ 01 июня 2018

В пакете data.task я мог бы разрешить или отклонить вызов API следующим образом:

import Task from 'data.task';
import fs from 'fs';

const readFile = (filename, enc) => {
  return new Task((rej, res) =>
    fs.readFile(filename, enc, (err, contents) => {
      err ? rej(err) : res(contents);
    })
  );
};

Как мне это сделать в новой folktale версии Task?Я могу разрешать запросы, но как мне отказаться?Я пробовал следующее:

const {task, rejected} = require('folktale/concurrency/task');
import fs from 'fs';

const readFile = (filename, enc) => {
  return task(res => {
    fs.readFile(filename, enc, (err, contents) => {
      err ? rejected(err) : res.resolve(contents);
    });
  });
};

const writeFile = (filename, contents) => {
  return task(res => {
    fs.writeFile(filename, contents, (err, success) => {
      err ? rejected(err) : res.resolve(success);
    });
  });
};

const app = readFile('FILE_DOESNOT_EXIST.json', 'utf-8')
  .map(contents => contents.replace(/8/g, '6'))
  .chain(contents => writeFile('config1.json', contents));

app.run().listen({
  onCancelled: () => {
    console.log('the task was cancelled');
  },
  onRejected: () => {
    console.log('something went wrong');
  },
  onResolved: value => {
    console.log(`The value is Good`);
  },
});

Когда я дал файл, который не существует, обработчик onRejected не вызывается.

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

Что я вижу сейчас: Ничего.Программа не выдает ошибку, но она также не производит ничего, она просто работает как обычно.

При использовании data.task (более старая версия Task), я могу использовать reject, поэтому она все еще работаеттам.Как мне сделать это сейчас с новой версией Task?

1 Ответ

0 голосов
/ 01 июня 2018

Хорошо, это действительно глупо!По какой-то причине я не смог сразу найти это решение в документации. Вот почему я импортировал rejected из task ...

В основном resolver функция, приходящая из задачи, имеет не только resolve, но также reject, что должно было быть очевидно, но этого не было на док.

Так вот рабочий код:

import {task} from 'folktale/concurrency/task';
import fs from 'fs';

const readFile = (filename, enc) => {
  return task(res => {
    fs.readFile(filename, enc, (err, contents) => {
      err ? res.reject() : res.resolve(contents);
    });
  });
};

const writeFile = (filename, contents) => {
  return task(res => {
    fs.writeFile(filename, contents, (err, success) => {
      err ? res.reject() : res.resolve(success);
    });
  });
};

const app = readFile('confg.json', 'utf-8')
  .map(contents => contents.replace(/8/g, '6'))
  .chain(contents => writeFile('config1.json', contents));

app.run().listen({
  onCancelled: () => {
    console.log('the task was cancelled');
  },
  onRejected: () => {
    console.log('something went wrong');
  },
  onResolved: value => {
    console.log(`The value is Good`);
  },
});
...