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 に答える