2

一点背景;我使用 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;
    });
}

更有效率?

更明确地说,节点是否受益于后者,它被告知忽略回调函数的返回值?

4

1 回答 1

2

我同样同意,一般而言,“return callback()”与“callback(); return;”相比不会造成伤害,也不会显着影响性能。我决定在测试“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% 的时间。

于 2012-10-12T02:32:13.250 回答