2014-04-09 154 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 
}); 

(虽然这是一个有点多余,我敢肯定,你的实际代码更复杂)