真正理解 node / js 中的基本回调

understanding REALLY basic callbacks in node / js

我试图通过编写一些 BASIC 测试来了解回调,看看会发生什么。我正在使用 mocha 运行 这个。显然,我是回调的新手,但我不明白为什么这不起作用。

import fs from 'fs';


describe('named callbacks', function() {
 it('runs something using callbacks', function() {

    function runTest() {
        return fs.readFile('test.txt', onReadFile);

        function onReadFile(err, data) {
            if (err) {
                console.log('error reading file', err);
                return err;
            }
            fs.writeFile('testoutfile.txt', data, onWriteFile);
        }

        function onWriteFile(err, data) {
            if (err) {
                console.log('write error', err);
                return err;
            }
            console.log('file written!', data);
        }

    }

    runTest();
 });
});

测试 运行s,它创建了输出文件,但没有写入任何内容,也没有记录任何错误。

我习惯于自上而下地编写程序,这种回调的东西让我这样的人感到困惑。我在这里命名我所有的回调,这样我就可以尝试遵循逻辑。我真的很想了解为什么这不起作用。

您需要向 Mocha 声明您的测试是异步的。您可以通过以下两种方式之一执行此操作:return 承诺,或使用 done 回调。您拥有的代码适用于后者:

describe('named callbacks', function() {
 it('runs something using callbacks', function(done) {

    function runTest() {
        return fs.readFile('test.txt', onReadFile);

        function onReadFile(err, data) {
            if (err) {
                console.log('error reading file', err);
                done(err);
            }
            fs.writeFile('testoutfile.txt', data, onWriteFile);
        }

        function onWriteFile(err, data) {
            if (err) {
                console.log('write error', err);
                done(err);
            }
            console.log('file written!', data);
            done();
        }

    }

    runTest();
 });
});

变化是:

  1. done作为参数添加到传递给it的函数中。

  2. return err 替换为 done(err)。这会将错误传递给 Mocha。

  3. onWriteFile 函数的末尾添加 done()