0

所以我必须share循环计算一些。在该循环的每次迭代中,我都必须rent从数组中调用一个变量。所以我calculate从数据库的东西中分离了功能。

var calculate = function() {
    while(count < 100) {
        var share = 50;
        var shareArray = [];

        for(var i = 0; i < 100; i++) {

            var pension = share*2; // mathematical stuff
            // Gets a rent from a database and returns it in a callback
            getRent(modules, share, function(rent) {
                share = rent*foo; // some fancy mathematical stuff going on here
                // I need to get the share variable above out of its function scope
            });
                    // I need the share variable right here
            shareArray.push(share);     // the value of share will be for i = 0: 50, i= 1: 50 ...
                                        // This is not what i want, i need the share value from getRent()
        }
        count++;
    }
}

现在您可能会看到,我遇到了以下麻烦。因为我在 node.js 中工作,所以rent从模块数组中获取变量的唯一方法是通过这个名为getRent(). 问题是,我需要share这一步之后的值,但在getRent(). 有什么办法我可以做到这一点?

这是getRent()- 功能:

var getRent = function(modules, share, callback) {
        // Searching for a fitting rent in the modules array
        // Just assume this is happening here
        callback(rent);
};

所以问题是:我怎样才能“返回” share

getRent(modules, share, function(rent) {
                    share = rent*foo; // some fancy mathematical stuff going on here
                    // I need to get the share variable above out of its function scope
});

以任何方式?

4

2 回答 2

1

如果getRent是异步的,则无法同步获取结果。从根本上说,在它最终返回之前,您不知道getRent最终将提供给它的回调的值。所以这不是功能范围的问题,而是时间问题。您只需要等待getRent执行它的操作,然后才能获得rent. 您需要重构代码,使其calculate也是异步的。

就像是:

// Refactor calculate to be async:
function calculate(cb) {
    var data = [];
    for ( var i=0; i<100; i++ ) {
        getRent(function (rent) {
            data.push(rent);
            if ( data.length === 100 ) cb(data);
        });
    }
}

// And then use it async:
calculate(function (data) {
    // data array arrives here with 100 elements
});

上面的答案可能类似于您使用 vanilla JS 实现它的方式。从长远来看,使用asyncmiggs 建议的库可能是一个好主意。但就像我说的那样,如果你使用 vanilla JS 或asynclib,那么你将不得不在这段代码和调用它的代码中重构异步性。

于 2013-02-14T22:54:06.767 回答
0

您想使用库 ( ) 的whilst方法来简化它:asyncnpm install async

var count = 0;
var shareArray = [];

async.whilst(
    function () { 
        return count < 100; 
    },
    function (next) {
        count++;
        getRent(function(rent) {
            // What does modules do anyway??
            // Dont know where foo comes from...
            shareArray.push(rent*foo); // some fancy mathematical stuff going on here
            next();
        });
    },
    function (err) {
        console.log(shareArray);
        // Do sth. with shareArray
    }
);

如果您可以并行请求所有 100 个调用,您也可以使用该parallel功能。

于 2013-02-14T22:31:15.780 回答