2017-07-30 395 views
0

我曾嘗試下面的代碼,但得到undefined函數返回`undefined` 10

init: function(parent){ 
    var value = this.read_data(); 
    console.log('value',value);//Prints undefined 
} 

read_data: function() { 
    my_model.query(["name"]).all().then(function(data){ 
     console.log('dataa',data);//Here print value 
     return data[0].name 
    }); 
}, 

我該如何解決這個問題?

回答

4

read_data功能是異步的,它調用一個函數,不會立即返回的東西,但只會做了一段時間後。因此你不能僅僅從你的read_data函數返回值,只是因爲它現在還沒有由函數完成的時間。另外,你實際上不會從read_data函數本身返回任何東西。

你叫my_model.query(["name"]).all()這顯然會返回一個承諾,一個異步任務。完成該任務(.then(…))後,您將調用一個函數,該函數將數據註銷並返回一個值。

到目前爲止好,這使得整個事情返回一個承諾本身,該值data[0].name一旦查詢完成的承諾。然而,這個承諾永遠不會被退回,所以你無法知道什麼時候發生。

爲了解決這個問題,簡單地從read_data返回整個事情:

read_data: function() { 
// return the resulting promise here 
// ↓↓↓↓↓↓ 
    return my_model.query(["name"]).all().then(function(data){ 
     console.log('dataa',data);//Here print value 
     return data[0].name 
    }); 
} 

這使得read_data正確異步本身並使其返回結果的承諾。所以,現在你可以消耗這一承諾在您的init功能:

init: function(parent){ 
    this.read_data().then(function (value) { 
     console.log('value', value); 
    }); 
} 

由於read_data()回報的承諾,我們必須等待它的結果,一旦承諾得到解決,只能採取行動。爲此,我們再次使用.then(…)在承諾履行後做了些事情。