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

文件不存在时Promise仍触发成功回调,如何触发失败回调?

问题分析与解决方案

嘿,咱们先搞明白为啥现在不管文件存不存在,都会触发f()打印"aaa"——你的代码里有几个关键问题:

  1. Promise状态一旦确定就没法改:你在fs.open的回调里先调用了resolve,不管有没有错误,Promise只要进入resolved状态,后面的reject就完全失效了,所以永远只会走成功回调。
  2. 完全没处理错误判断:你忽略了fs.open回调里的argError参数,根本没根据文件是否存在来决定调用resolve还是reject。
  3. resolve/reject的用法错了:这两个方法都只能传一个参数,你写的resolve("done", 1000)里的第二个参数1000是无效的,reject同理。
  4. 缺了fs模块引入:Node.js里操作文件必须先引入fs模块,不然objFs就是未定义的,运行会直接报错。

下面是修改后的完整代码,能让文件不存在时触发g():

const objFs = require('fs'); // 先引入文件系统模块
function f() { console.log("aaa") }
function g() { console.log("ddd") }
function fileFunction() {
  console.log("In function")
  let objPromise = new Promise( ( resolve, reject ) => {
    objFs.open( 'unew.js', 'r', ( argError, argFD ) => {
      // 根据错误状态分支处理
      if (argError) {
        // 文件不存在/打开失败时,调用reject触发失败回调
        reject(new Error("File not found!"));
      } else {
        // 文件打开成功时,调用resolve触发成功回调
        resolve("done");
        // 记得用完文件要关闭,避免资源泄漏
        objFs.close(argFD, (err) => {
          if (err) console.error('关闭文件出错:', err);
        });
      }
    } )
  } );
  objPromise.then( f, g )
  // 加个catch捕获未处理的Promise错误,避免程序崩溃
  .catch(err => console.error('Promise错误:', err));
}
fileFunction();

关键修改点说明:

  • 引入fs模块:Node.js环境下必须显式引入才能使用文件操作API;
  • 错误分支判断:通过argError判断文件是否打开成功,错误时调用reject,成功时调用resolve;
  • 修正resolve/reject参数:只传递一个有效参数,多余参数会被Promise忽略;
  • 新增文件关闭逻辑:打开文件后及时关闭,避免资源占用;
  • 添加catch捕获:防止Promise内部未处理的错误导致程序异常退出。

这样修改后,当unew.js不存在时,fs.open会返回错误,Promise会触发reject,进而调用g()打印"ddd"。

内容的提问来源于stack exchange,提问作者Aquarius_Girl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:48:15