Javascript 回调必须是节点中的函数
我是NodeJS新手,这段代码我无法正常工作。我想先删除stuff中的文件,然后删除文件本身 请问我做错了什么Javascript 回调必须是节点中的函数,javascript,node.js,Javascript,Node.js,我是NodeJS新手,这段代码我无法正常工作。我想先删除stuff中的文件,然后删除文件本身 请问我做错了什么 var fs = require("fs"); fs.unlink('./stuff/writeMe.txt', () => { fs.rmdir('stuff'); }); 您可以使用rimraf包(递归删除)。否则,这是目录中唯一的文件吗?您可以使用rimraf包(递归删除)。否则,这是目录中唯一的文件吗?在节点中调用异步函数,如fs
var fs = require("fs");
fs.unlink('./stuff/writeMe.txt', () => {
fs.rmdir('stuff');
});
您可以使用rimraf包(递归删除)。否则,这是目录中唯一的文件吗?您可以使用rimraf包(递归删除)。否则,这是目录中唯一的文件吗?在节点中调用异步函数,如
fs.unlink
和fs.rmdir
,将启动任务。您将一个函数作为参数传递给他们,即回调函数,该函数在任务完成时被调用。回调函数有一个参数,告诉您操作是否成功完成
当fs.unlink
完成时,只调用fs.rmdir
就已经部分地利用了这一点。现在,您需要说明当fs.unlink
完成时(即使没有),要做什么,并开始检查错误
出现错误时可以执行的一个示例是抛出该错误,它将打印该错误并退出流程
fs.unlink('stuff/writeMe.txt',(err)=>{
如果(错误)抛出错误;
fs.rmdir('stuff',(err)=>{
如果(错误)抛出错误;
});
});
在节点中调用异步函数,如fs.unlink
和fs.rmdir
,启动任务。您将一个函数作为参数传递给他们,即回调函数,该函数在任务完成时被调用。回调函数有一个参数,告诉您操作是否成功完成
当fs.unlink
完成时,只调用fs.rmdir
就已经部分地利用了这一点。现在,您需要说明当fs.unlink
完成时(即使没有),要做什么,并开始检查错误
出现错误时可以执行的一个示例是抛出该错误,它将打印该错误并退出流程
fs.unlink('stuff/writeMe.txt',(err)=>{
如果(错误)抛出错误;
fs.rmdir('stuff',(err)=>{
如果(错误)抛出错误;
});
});
我建议将新的Promissions接口用于带有gasync/await
的fs
模块,因为它可以更轻松地对异步操作进行排序,而无需嵌套。它还使错误处理更加简单:
const fsp = require("fs").promises;
async function someFunction() {
try {
await fsp.unlink('./stuff/writeMe.txt');
await fsp.rmdir('./stuff');
} catch(e) {
// got an error, handle it here
console.log(e);
}
}
我建议在g
async/await
中为fs
模块使用新的promissions接口,因为它可以更轻松地对异步操作进行排序,而无需嵌套。它还使错误处理更加简单:
const fsp = require("fs").promises;
async function someFunction() {
try {
await fsp.unlink('./stuff/writeMe.txt');
await fsp.rmdir('./stuff');
} catch(e) {
// got an error, handle it here
console.log(e);
}
}
您需要向rmdir添加回调函数您需要向rmdir添加回调函数这与问题有何关系?问题中的代码删除文件,然后删除文件所在的目录。rmdir适用于空目录,所以我的角度是dir中可能有其他文件,或者您可以使用rimraf删除包含文件的整个目录。这与问题有什么关系?问题中的代码删除文件,然后删除文件所在的目录。rmdir适用于空目录,所以我的角度是,dir中可能有其他文件,或者您只需使用rimraf删除包含文件的整个目录。永远不要在普通异步回调中建议抛出err。它没有任何用处。显示实际错误处理的示例。我知道node.js文档就是这样展示的,它教了整整一代新手错误地编写错误处理的方法。对普通异步回调的抛出在您可以捕获它的地方没有任何用处(在本例中,它返回到
fs
库的异步内部)。@jfriend00:它什么也不做。它“打印[错误]并退出流程”,就像我在回答中写的那样。对于脚本,这是您经常想要的。(好吧,这是有承诺的,但这是一个类似的.catch(err=>{process.nextTick(()=>{throw err;});})
)只有在不太严重的程序中,当出现错误时,才希望程序异常退出。99.99%的时间您正在编写一些调用方将调用的代码,而调用方希望知道是否有错误。这不是教新手如何编码的最好例子。我不知道你为什么要在这里防守,当你知道这不是你应该教一个新手的,你可以证明一个更好的做法。我的评论要点是让OP知道他们通常不应该编写这种类型的代码。永远不要在普通异步回调中推荐throw err
。它没有任何用处。显示实际错误处理的示例。我知道node.js文档就是这样展示的,它教了整整一代新手错误地编写错误处理的方法。对普通异步回调的抛出在您可以捕获它的地方没有任何用处(在本例中,它返回到fs
库的异步内部)。@jfriend00:它什么也不做。它“打印[错误]并退出流程”,就像我在回答中写的那样。对于脚本,这是您经常想要的。(好吧,这是有承诺的,但这是一个类似的.catch(err=>{process.nextTick(()=>{throw err;});})
)只有在不太严重的程序中,当出现错误时,才希望程序异常退出。99.99%的时间您正在编写一些调用方将调用的代码,而调用方希望知道是否有错误。这不是教新手如何编码的最好例子。我不知道你为什么要在这里防守,当你知道这不是你应该教一个新手的,你可以证明一个更好的做法。我评论的目的是让OP知道他们通常不应该编写这种类型的代码。我如何在不等待的情况下调用promise接口?@AntonDuzenko-我不知道你的意思。所有async
函数都会返回一个承诺,因此调用方必须