文件不存在时Promise仍触发成功回调,如何触发失败回调?
问题分析与解决方案
嘿,咱们先搞明白为啥现在不管文件存不存在,都会触发f()打印"aaa"——你的代码里有几个关键问题:
- Promise状态一旦确定就没法改:你在
fs.open的回调里先调用了resolve,不管有没有错误,Promise只要进入resolved状态,后面的reject就完全失效了,所以永远只会走成功回调。 - 完全没处理错误判断:你忽略了
fs.open回调里的argError参数,根本没根据文件是否存在来决定调用resolve还是reject。 - resolve/reject的用法错了:这两个方法都只能传一个参数,你写的
resolve("done", 1000)里的第二个参数1000是无效的,reject同理。 - 缺了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
相关产品推荐
相关产品推荐

