添加回调到for循环功能

时间:2016-10-29 15:46:47

标签: javascript for-loop

我有一个函数,我传递一个数组或一个对象,然后它查找特定的键并相应地编辑它们的值,

function iterate(obj, delta) {
        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                if (typeof obj[property] == "object") {
                    iterate(obj[property],delta);
                } else {
                   if(property === 'unix_time'){
                    var bee = parseInt(obj[property]);
                    var b = bee + parseInt(delta);
                       obj[property] = b;
                   }
               }                   
            }
        }
    }

基本上,它寻找" unix_time"键并添加一个数字" delta"它。

问题:当我将其称为异步时,它变为未定义,如何添加一个我可以简单地用来确定函数已完成执行的回调。或者我应该为它添加一个承诺吗?

例如,当我运行它时,它会完美地返回

console.log("new one", obj);
iterate(obj, 3600000)

但这是一个问题,它变得未定义

        var dd = iterate(obj, 3600000);
        res.status(200).send(JSON.stringify(dd));

2 个答案:

答案 0 :(得分:2)

正如评论中所提到的,你的功能是同步的,它会在你调用之后立即返回:

var result = iterate(tree, delta);

但是,正如目前所写,result变量的值为undefined,因为iterate函数不会返回任何内容。

如果你有这样的设置:

var obj = {...};
iterate(obj, 3600000)
console.log(obj) // correctly outputs modified object

它将输出修改后的对象,因为您在此处未使用函数返回的值。但是,在这种情况下:

console.log("new one", iterate(obj, 3600000)); // ouputs `undefined`

使用返回的值,它是undefined

使用您提供的用例,您可以修改如下用法:

iterate(obj, 3600000);
res.status(200).send(JSON.stringify(obj));

它会正常工作。或者您需要修改iterate以返回值。提供obj的示例,以便我可以对您的iterate函数进行修改。

修改了iterate函数:

function iterate(obj, delta) {
    obj.forEach(function (element) {
        if (element.hasOwnProperty('unix_time')) {
            element['unix_time'] = parseInt(element['unix_time']) + parseInt(delta);
        }
    });
    return obj;
}

答案 1 :(得分:-1)

我不知道我理解你的问题。但是,如果你想使用回调,你应该将这个功能分成两部分。一个用于主要操作,另一个用于递归。

function iterate(obj, delta, callback) {
    interate_recursive(obj, delta);
    if(typeof callback != 'undefined')
         return callback();
    else return obj;
}

function interate_recursive(obj,delta){
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            if (typeof obj[property] == "object") {
                iterate(obj[property],delta);
            } else {
               if(property === 'unix_time'){
                var bee = parseInt(obj[property]);
                var b = bee + parseInt(delta);
                   obj[property] = b;
               }
           }                   
        }
    }
}