从data.task迁移至folktale Task:如何正确处理拒绝逻辑?
解决新版folktale Task的错误处理问题
我来帮你搞定这个问题啦!你现在的代码里错误处理没生效,核心是没搞清楚新版folktale中Task构建器的正确用法——和旧版data.task的回调方式不一样哦。
先看修正后的完整代码
const { task } = require('folktale/concurrency/task'); const fs = require('fs'); const readFile = (filename, enc) => { return task(resolver => { fs.readFile(filename, enc, (err, contents) => { // 重点:用resolver的reject方法触发任务失败 err ? resolver.reject(err) : resolver.resolve(contents); }); }); }; const writeFile = (filename, contents) => { return task(resolver => { fs.writeFile(filename, contents, (err) => { err ? resolver.reject(err) : resolver.resolve('文件写入完成'); }); }); }; 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: (err) => { console.log('something went wrong:', err.message); }, onResolved: value => { console.log(`The value is Good: ${value}`); }, });
为什么你的代码没生效?
你之前用了rejected(err),但这个函数的作用是直接创建一个已经处于拒绝状态的Task实例,而不是用来通知当前正在构建的Task进入失败状态。
新版folktale的task()构建器会传入一个resolver对象,这个对象自带两个方法:
resolver.resolve(data):标记任务成功,传递结果resolver.reject(error):标记任务失败,传递错误
当你在fs.readFile的回调里调用resolver.reject(err)时,整个任务链就会触发onRejected处理器,也就是你想要的“输出something went wrong”的效果啦。
额外小提示
如果是在同步场景下需要直接返回一个失败的Task,才需要用到rejected函数,比如:
const { rejected } = require('folktale/concurrency/task'); // 直接创建一个已拒绝的任务 const syncFailedTask = rejected(new Error('同步操作失败'));
内容的提问来源于stack exchange,提问作者leogoesger
相关产品推荐
相关产品推荐

