回调函数节点js的回调

时间:2017-09-26 16:26:50

标签: javascript

所以在Node中我们使用异步函数。为此,我们使用回调函数作为参数。但是如何执行最终函数,之后我想终止代码?刚刚传递空函数?这是一个例子:

fs.mkdir('stuff', function(){
    fs.readFile('readMe.txt', 'utf8', function(err, data) {
        fs.writeFile('./stuff/writeMe.txt', data);
    });
});

mkdir有回调函数 - 一切正常

readFile具有回调函数 - 一切正常

writeFile没有回调函数,因为这是我想要做的最后一件事,但后来我在控制台中出错了: “DeprecationWarning:不支持回调调用异步函数。”

我是否每次都这样做,将空函数作为回调传递以避免错误?对此最好的做法是什么?

2 个答案:

答案 0 :(得分:3)

  

我是否每次都这样做,将一个空函数作为回调传递以避免错误?

没有

  

最佳做法是什么?

传递一个函数并处理它报告的任何错误。您还需要处理来自mkdirreadFile的错误,这些错误目前是您忽略的。

E.g:

fs.mkdir('stuff', function(err) {
    if (err) {
        // Do something with the fact mkdir failed
    } else {
        fs.readFile('readMe.txt', 'utf8', function(err, data) {
            if (err) {
                // Do something with the fact readFile failed
            } else {
                fs.writeFile('./stuff/writeMe.txt', data, function(err) {
                    if (err) {
                        // Do something with the fact writeFile failed
                    }
                });
            }
        });
    }
});

...这是回调地狱的一个公平例子,这是使用承诺的动机的一部分。您可以宣传fs API(使用几个库中的任何一个,例如promisify),并按照以下方式进行:

fsp.mkdir('stuff')
.then(() => fsp.readFile('readMe.txt', 'utf8'))
.then(data => fsp.writeFile('./stuff/writeMe.txt', data))
.catch(err => {
    // Do something with the fact something failed
});

...其中fsp是promisified fs API的占位符。

在Node 8.x +中,您可以使用async / await使用这些已宣传的API编写具有同步效果的代码:

// This must be inside an `async` function
try {
    fsp.mkdir('stuff');
    const data = await fsp.readFile('readMe.txt', 'utf8');
    await fsp.writeFile('./stuff/writeMe.txt', data);
} catch (err) {
    // Do something with the fact something failed
}

答案 1 :(得分:0)

您可以改用writeFileSync。

fs.mkdir('stuff', function(){
    fs.readFile('readMe.txt', 'utf8', function(err, data) {
        fs.writeFileSync('./stuff/writeMe.txt', data);
    });
});