2014-04-09 31 views
47

Tôi có hàm javascript nơi tôi muốn trả lại giá trị mà tôi nhận được sau phương thức trả lại. Dễ thấy hơn giải thíchgiá trị trả lại sau lời hứa

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

Cách tốt nhất để thực hiện điều này với lời hứa là gì. Như tôi đã hiểu, số return val sẽ trả lại trước khi tra cứuGiá trị tiền tệ đã thực hiện sau đó, nhưng tôi không thể return res.val vì điều đó chỉ trả về từ hàm bên trong.

+0

@OneKitten, những câu hỏi mà bạn liên kết đến không phải là sử dụng lời hứa, nó đang chuyển một chức năng như gọi lại, điều đó hoàn toàn khác. – pedalpete

+1

Đó là khái niệm tương tự, lời hứa vẫn không đồng bộ. –

+1

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

Trả lời

16

Cách tốt nhất để làm điều này sẽ được sử dụng lời hứa chức năng quay trở lại như nó là, như thế này

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

Chức năng đó gọi một chức năng không đồng bộ không thể chờ đợi cho đến khi chức năng async trả về một giá trị. Bởi vì, nó chỉ gọi hàm async và thực thi phần còn lại của mã trong đó. Vì vậy, khi một hàm async trả về một giá trị, nó sẽ không được nhận bởi cùng một hàm gọi nó.

Vì vậy, ý tưởng chung là viết mã phụ thuộc vào giá trị trả về của hàm async, trong chính hàm async.

+3

Bạn không sai, nhưng giải pháp của bạn vi phạm nguyên tắc đóng gói. Đối tượng hoặc hàm gọi getValue (...) không nên biết và không nên biết về hàm lookupValue (...). Bằng cách này, nếu thủ tục chính xác trong các thay đổi getValue (...), các hàm dựa vào nó không cần phải được cập nhật. –

13

Sử dụng một mô hình cùng những dòng này:

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

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

(mặc dù điều này là một chút dư thừa, tôi chắc chắn rằng mã thực tế của bạn là phức tạp hơn)

Các vấn đề liên quan