使用requirejs一个循环中的函数(Functions within a loop using

2019-10-19 11:08发布

我在与整个使用requirejs不同的模块在循环中调用函数的问题。 循环内的函数调用驻留在模块A,并且执行将触发关闭使用jQuery Ajax请求模块B的功能。 环路打完具有不同参数的不同请求的每次迭代被传递到模块B的功能将触发关闭Ajax请求。 当Ajax请求的成功函数执行,我发现我的所有参数值总是最后Ajax调用所做的价值观,所有4所独立的Ajax调用。

我做了一些谷歌上搜索这听起来像一个循环中执行功能时,这是一个很常见的问题。 此修复程序往往是打出来的函数调用成不同的功能,创建一个不同的范围。 由于我的循环和Ajax调用有两种不同的模块,我本以为这样可以解决这个问题,但它仍然存在。

我试着在其他堆栈溢出的职位一些解决方案,如: JSLint的错误“不要在循环中做出的功能。” 导致问题有关JavaScript本身和如何参数传递到setTimeout调用定义一个匿名函数? 没有成功。 任何人有任何想法?

对于回路模块示例代码:

define(["mpos"],
    function(mpos){

        var monitor = {
            startMonitoring : function(poolObj){    
                // Start Monitoring
                $.each(mpos.msgs, function(action,callback){
                    poolObj.action = action;
                    mpos.sendApiRequest(poolObj,action,callback);

                });
            }
        };

        return monitor;
    }
);

为Ajax模块B的示例代码 - 该模块如在模块A MPOS引用

define(["mule","constants"],
function(mule,constants){

    var mpos = {
        sendMessage : function(postData,callback,$poolOut){

            return $.ajax({
                'type':'post',
                'url':constants.URLS.proxy,
                'data':{'url':postData},
                success : function(data){
                    // if we have $poolOut we know this is a mpos call
                    if($poolOut != undefined){
                        var keys = Object.keys(data);
                        // add poolOut to data
                        data.poolOut = $poolOut;

                        var poolObj = $poolOut.data('poolObj');
                        if(poolObj){
                            var action = poolObj.action;
                            console.log(poolObj,action);
                            if(action){
                                if(action == "getuserstatus"){
                                    mule.registerPool(poolObj);
                                }
                            } else {
                                log.error("No action on poolObj while attempting to calculate the need for a registerPool call");
                            }
                        }
                    }
                    // parse data
                    callback.apply(this, data);
                },
                error : function(x,h,r){ ... },
                dataType : 'json'
            });
        },
        sendApiRequest : function(poolObj,action,callback){
            var url = poolObj.url + '&page=api&action=' + action;

            var $poolOut = constants.cache.monitorOutput.find('.pool-out.' + poolObj.id);

            var dfd = mpos.sendMessage(url,callback,$poolOut);

            $.when(dfd).always(function(){
                var refreshTimer = setTimeout(function(){
                    if(constants.state.monitorEnabled){
                        mpos.sendApiRequest(poolObj, action, callback);
                    }
                }, poolObj.refreshRate);

            });
        },
        msgs : {
            "getuserstatus" : function(data){ ... },
            "getpoolstatus" : function(data){ ... },
            "getuserworkers" : function(data){ ... },
            "getuserbalance" : function(data){ ... }
        }
    };

    return mpos;
}
);

谢谢!

Answer 1:

注:我假设$poolOut.data('poolObj')被用来寻找poolObj在调用通过实例startMonitoring ,并且将每次返回同一个实例。

幽州“正在传递的循环打完使用不同的参数不同的请求的每次迭代到模块B的功能将触发关闭Ajax请求。”

这种说法是不正确的。 每次迭代火灾了与第一个参数不同的请求poolObj是在每次迭代中是相同的

在你的.each迭代中,要覆盖的值poolObj.action每次调用之前sendApiRequest

在AJAX成功处理程序,所有迭代完成之后 ,很可能调用的价值poolObj.action将有你在它最后一次迭代中设置的值。

为了解决这个问题,我想你需要通过action作为参数sendMessage ,也让一个单独的值被存储在封闭的每个函数调用。

var mpos = {
    sendMessage : function(postData,action,callback,$poolOut){

        return $.ajax({
            'type':'post',
            'url':constants.URLS.proxy,
            'data':{'url':postData},
            success : function(data){
                // if we have $poolOut we know this is a mpos call
                if($poolOut != undefined){
                    var keys = Object.keys(data);
                    // add poolOut to data
                    data.poolOut = $poolOut;

                    var poolObj = $poolOut.data('poolObj');
                    if(poolObj){
                        // action is not guaranteed to be the same as poolObj.action here,
                        // since poolObj.action may have changed since this function was first called
                        console.log(poolObj,action);
                        if(action){
                            if(action == "getuserstatus"){
                                mule.registerPool(poolObj);
                            }
                        } else {
                            log.error("No action on poolObj while attempting to calculate the need for a registerPool call");
                        }
                    }
                }
                // parse data
                callback.apply(this, data);
            },
            error : function(x,h,r){ ... },
            dataType : 'json'
        });
    },
    sendApiRequest : function(poolObj,action,callback){
        var url = poolObj.url + '&page=api&action=' + action;

        var $poolOut = constants.cache.monitorOutput.find('.pool-out.' + poolObj.id);

        var dfd = mpos.sendMessage(url,action,callback,$poolOut);

        $.when(dfd).always(function(){
            var refreshTimer = setTimeout(function(){
                if(constants.state.monitorEnabled){
                    mpos.sendApiRequest(poolObj, action, callback);
                }
            }, poolObj.refreshRate);

        });
    },
    msgs : {
        "getuserstatus" : function(data){ ... },
        "getpoolstatus" : function(data){ ... },
        "getuserworkers" : function(data){ ... },
        "getuserbalance" : function(data){ ... }
    }
};


文章来源: Functions within a loop using requirejs