我有一个函数,我传递一个数组或一个对象,然后它查找特定的键并相应地编辑它们的值,
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));
答案 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;
}
}
}
}
}