2014-04-09 233 views
47

我有一個javascript函數,我想返回返回方法後得到的值。 更容易看到不是解釋承諾後的返回值

function getValue(file){ 
    var val; 
    lookupValue(file).then(function(res){ 
     val = res.val; 
    } 
    return val; 
} 

什麼是承諾要做到這一點的最好辦法。據我瞭解,return val將在lookupValue完成之前返回,但我不能return res.val,因爲這只是從內部函數返回。

+0

@OneKitten,您鏈接到的問題不是使用承諾,它傳遞的是一個函數作爲回調函數,我認爲這是完全不同的。 – pedalpete

+1

這是一個概念,承諾仍然是異步的。 –

+1

http://stackoverflow.com/q/22536385/1348195 –

回答

16

要做到這一點是使用承諾返回功能,因爲它是這樣

lookupValue(file).then(function(res) { 
    // Write the code which depends on the `res.val`, here 
}); 

其調用異步函數不能等到異步函數返回一個值的函數的最佳方式。因爲它只是調用異步函數並執行其中的其餘代碼。所以,當一個異步函數返回一個值時,它將不會被調用它的同一個函數接收。

所以,一般的想法是在異步函數本身中編寫依賴於異步函數的返回值的代碼。

+3

你沒有錯,但是您的解決方案違反封裝原則。調用getValue(...)的對象或函數不應該知道,也不應該知道函數lookupValue(...)。這樣,如果getValue(...)中的確切過程發生更改,則依賴於它的函數不需要更新。 –

13

使用沿着這些線條組成的圖案:

function getValue(file) { 
    return lookupValue(file); 
} 

getValue('myFile.txt').then(function(res) { 
    // do whatever with res here 
}); 

(雖然這是一個有點多餘,我敢肯定,你的實際代碼更復雜)