如何在javascript中的回调函数之后获取for循环中的递增值?

时间:2015-08-06 08:47:49

标签: javascript jquery angularjs

我的要求:

我想使用for循环获取值列表。在for循环中,一次迭代完成一次,然后回调将发送该值列表(数组)。    一旦第一次迭代完成,第二次循环值应该得到递增值。

例如:5个值 在第5次迭代之后,循环结束。那么第二个时间循环应该从'0'开始,但这里它以最后一个递增的值开始。请帮助我实现这一目标。

下面的代码第一次正常运行。

回调功能:

$inventoryManagement.getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId(objectId,attributeId, function(objectAttributeBlockElement) {
    //$scope.val = myOwnJ;
    console.log(objectAttributeBlockElement);
});

功能:

var myOwnJ = 0;
// Getting ObjectId And AttributeId Using CellId For Normal Controls
var getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId = function(objectId,attributeId, callback) {

    var objectAttributeBlockElement = [];// one array

    try {
        // iterate over the objectAttributes
        for (var i = 0; i < pageObject.objects.length; i++) {               
            if (pageObject.objects[i].id == objectId) { 
                var name = "";
                var labelName = "";
                var dataTypeId = "";                    
                for (;myOwnJ < pageObject.objects[i].objectAttribute.length;) {                 
                    name = pageObject.objects[i].objectAttribute[myOwnJ].name;// got the current label name
                    labelName = pageObject.objects[i].objectAttribute[myOwnJ].labelName;// got the current name
                    dataTypeId = pageObject.objects[i].objectAttribute[myOwnJ].dataTypeId;// got the current dataTypeId

                    objectAttributeBlockElement.push(name,labelName,dataTypeId);
                    callback(objectAttributeBlockElement, myOwnJ++);                        
                    return;                         
                }
            }
        }
        throw {
            message: "objectId not found: " + objectId
        };
    } catch (e) {
        console.log(e.message + " in getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId");
    }
};

2 个答案:

答案 0 :(得分:1)

您可以将j作为附加功能参数传递,例如

var getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId = function(objectId, attributeId, j, callback) {

所以它不会是局部变量。然后,不要在本地声明它,而是使用以下内容:

for (j = ((j === null) ? 0 : j); j < pageObject.objects[i].objectAttribute.length; j++) {

这样,如果你用j调用你的函数,你会在每次调用后增加它。

另一种方法,我不建议,将j作为一个全局变量,通过声明它是你的函数而不是将它作为参数传递。这样您就不必修改函数声明了。如果您达到这一点,我强烈建议修改变量名称因为j对于全局范围变量来说过于通用,它迟早会引起麻烦:使用类似myOwnJ之类的内容没事。

编辑:完整源代码(根据OP的要求):

 var myOwnJ = 0;
// Getting ObjectId And AttributeId Using CellId For Normal Controls
var getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId = function(objectId,attributeId, callback) {

    var objectAttributeBlockElement = [];// one array

    try {
        // iterate over the objectAttributes
        for (var i = 0; i < pageObject.objects.length; i++) {               
            if (pageObject.objects[i].id == objectId) { 
                var name = "";
                var labelName = "";
                var dataTypeId = "";                    
                if(myOwnJ < pageObject.objects[i].objectAttribute.length) {                 
                     name = pageObject.objects[i].objectAttribute[myOwnJ].name;// got the current label name
                     labelName = pageObject.objects[i].objectAttribute[myOwnJ].labelName;// got the current name
                     dataTypeId = pageObject.objects[i].objectAttribute[myOwnJ].dataTypeId;// got the current dataTypeId

                     objectAttributeBlockElement.push(name,labelName,dataTypeId);
                     callback(objectAttributeBlockElement, myOwnJ++);                       
                    return;                         

                }
                else {
                    myOwnJ = 0;
                }

            }           
        }

        throw {
            message: "objectId not found: " + objectId
        };

    } catch (e) {
        console.log(e.message + " in getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId");
    }

};

答案 1 :(得分:0)

您正在寻找的是'j'的全局变量。虽然不鼓励使用它。

var j=0;

var getObjectNameAndAttributeAndDataTypeIdUsingObjectAndAttributeId = 

function(objectId, attributeId, callback) {
     //do your stuff

     //increment j
        j++;
}