Переход от data.task к народной сказке при обработке отказа
В 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 не вызывается.
Что я ожидаю увидеть: так как у меня есть программа, которая читает файл, который не существует, она должна работать на Rejected, который должен войти something went wrong
,
Что я вижу сейчас: ничего. Программа не выдает ошибку, но она также не производит ничего, она просто работает как обычно.
Когда используешь data.task
(более старая версия Task), я могу использовать отклонение, поэтому он все еще работает там. Как мне сделать это сейчас с новой версией Task?
1 ответ
Хорошо, это действительно глупо! По какой-то причине я не смог сразу найти это решение в документации. Вот почему я импортировал 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`);
},
});