You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:53:17