javascript - 在 Node.js 的回调周围放置返回值

标签 javascript node.js

一些背景知识;我使用node.js,发现通过在异步代码中返回所有回调可以避免许多错误。例如:

function useMyAsyncFunc(stuff, c, callback)
    myAsyncFunc(stuff.a, stuff.b, c, function (error, data) {
        if (error) {
            return callback(error);
        }

        // Long body of code in here.

        return callback(null, data);
    });
}

我的问题是,考虑到回调链可能相当大,执行上述操作会更好吗?

function useMyAsyncFunc(stuff, c, callback)
    myAsyncFunc(stuff.a, stuff.b, c, function (error, data) {
        if (error) {
           callback(error);
           return;
        }

        // Long body of code in here.

        callback(null, data);
        return;
    });
}

提高效率?

更明确地说, Node 是否从后者中受益,即被告知忽略回调函数的返回值?

最佳答案

我同样同意,一般来说,与“callback(); return;”相比,“return callback()”不会造成任何损害,也不会显着影响性能。我决定在测试“process.nextTick(... cb ...); return;”的同时对其进行测试。

尝试以下代码:

'use strict';

var showComments = 0;
var counter = 10000;
var ab = process.argv[2];

function a(x, cb) {
    var myCB = function (err, result) { x = result; }

    x *= 1.01;
    if (showComments) console.log('start counter =', counter, ', x = ', x);

    if (--counter > 0) a(x, myCB);

    if (showComments) console.log("cb'ing");

    switch (ab) {
        case 'a':
            return cb(undefined, x);

        case 'b':
            cb(undefined, x);
            return;

        case 'c':
            process.nextTick(function () { cb(undefined, x); });
            return;

        default:
            console.log('Oops!  Try typing "node testReturnCallBack.js [a|b|c]"');
            process.exit(1);
    }
}

var start = (new Date()).getTime();

a(1, function (err, result) {
    console.log('final result = ', result);

    var finish = (new Date()).getTime();
    var diff = finish - start;
    console.log('run took %d milliseconds', diff);
});

您应该看到,多次运行的情况“a”和“b”返回的时间基本相同(以毫秒为单位),而计算值保持不变。同时,情况“c”花费的时间大约长 50%。

关于javascript - 在 Node.js 的回调周围放置返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12843675/

相关文章:

javascript - 缺少回调时 `await promisify(setTimeout)(ms)` 是如何工作的?

javascript - 使用 jQuery 模板访问多维 JSON

javascript - 从 JSON 对象获取数组

javascript - 如何在 Google Cloud Function 中获取原始请求正文?

javascript - ejs <%- body %> 不工作

javascript - 开发 JavaScript 浏览器应用程序的最佳 Node 包是什么?

javascript - Google OAuth2 不适用于移动设备

macos - Node 的证书存储在哪里?

javascript - 使用 Express 访问 Node.js 中的模型

javascript - 与 DateJS 比较 2 次