2016-10-29 27 views
-2

我必須我傳遞數組或一個對象的功能,那麼它會尋找特定鍵,並相應地編輯它們的值,添加回調回路功能

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 「鍵併爲其添加數字」增量「。

問題:當我將它稱爲異步時,它變得未定義,我如何添加一個回調函數,我可以簡單地使用它來確定該函數已完成執行。或者,也許我應該添加一個承諾呢?

例如,當我運行這個它完美地返回

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

但是,這是一個問題,它變得不確定

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

你永遠不會從函數返回任何東西,所以它會總是返回'undefined'。我不知道你的意思是什麼*「當我不等它完成時......」* –

+0

你不需要回調或承諾,因爲你的功能是完全同步的。當它返回時,它已經完成執行。 – Frxstrem

+0

就像@squint所提到的 - 你不會從該函數返回任何東西,因此它將返回null。 如果您想知道您的函數是否已通過代碼中的不同if語句,請添加'console。日誌(「whateverYouWant」)',只要你想它 – Roysh

回答

2

正如評論所說,你的作用是同步的,後立即返回你這樣稱呼它:

var result = iterate(tree, delta); 

但是,正如它目前所寫,因爲iterate函數不返回任何內容,所以result變量的值將爲undefined

如果你有這樣的設置:

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; 
} 
+0

請檢查我的更新問題 – Tuna

+0

@Tuna,我更新了答案 –

+0

看看下面這個例子https://jsfiddle.net/1gmx3kk0/3/ – Tuna

-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; 
       } 
      }     
     } 
    } 
} 
+0

請看看我更新的問題 – Tuna