2015-11-02 17 views
13

Tôi đang xem xét các chức năng xử lý trả về các lời hứa với các hàm Ramda khác rồi pipeP. Tôi đang cố gắng so sánh các chức năng (một trong số đó trả về một lời hứa) với bằng như sau:Xử lý lập trình không đồng bộ với Ramda

getSectionFromDb :: obj -> promise 
getSectionFromData :: obj -> number 

R.equals(
    getSectionFromDb, 
    getSectionFromData 
) 

Có hai yếu tố ở đây. R.equals đầu tiên sẽ không đánh giá các hàm, nhưng vấn đề lớn hơn là tôi so sánh lời hứa với một số.

Có cách nào có chức năng để thực hiện loại công cụ này (tôi biết các hàm không phải là tham chiếu trong suốt, nhưng phải có cách xử lý io)? Có cách nào để thực hiện điều này không?

Cảm ơn.

+2

Âm thanh như bạn muốn 'nâng 'hàm' equals' - đầu tiên trong đơn nguyên lời hứa và sau đó trong hàm ứng dụng; tiếc là Ramda chỉ có thể nâng cho danh sách. – Bergi

+0

Vì vậy, bạn muốn có một chức năng '??? :: (obj -> Promise ) -> (obj -> number) -> (obj -> Promise ) '? – Bergi

+0

@Bergi: Tài liệu của Ramda không phải là khá lên đến snuff ở đây, nhưng 'lift' ** [không hoạt động trên tùy ý' Functors' ứng dụng] (https://github.com/ramda/ramda/blob/master/test/liftN .js # L42-L45) **. –

Trả lời

3

Bạn có thể sử dụng Promise.resolve để "bọc" một giá trị theo lời hứa.

getSectionFromDataPromise :: obj -> promise 
getSectionFromDataPromise = R.pipe(getSectionFromData , (val) => Promise.resolve(val)) 

Bằng cách này, bạn có thể quảng cáo (nâng) bất kỳ hàm nào trả về giá trị bình thường cho giá trị trả về lời hứa.

Nâng là khái niệm thiết yếu trong FP. Bạn có thể xem Array.map như một hàm nâng một hàm biến đổi một giá trị thành một hàm biến đổi một mảng các giá trị.

Bạn có thể sử dụng Promise.all để viết một hàm so sánh lời hứa và (ví dụ) ném lỗi nếu chúng không bằng nhau.

function promiseEquals (f1, f2) { 
    return Promise.all([f1(), f2()]).then(function(vals) { 
    if(!R.equals(vals[0], vals[1])) {throw "The values aren't equal"} 
    return vals[0] 
    }) 
} 

Cuối cùng bạn có thể kết hợp hai:

promiseEquals(getSectionFromDataPromise, getSectionFromDb) 
    .then(function(val){ 
    console.log(val) 
    }) 
    .catch(function(val){console.log("Error "+val)}) 
+0

Isn't (val) => Promise.resolve (val) chỉ là một cách tiết lộ Promise.resolve? – arcseldon

+0

lý tưởng là có, trong JS không. Hàm phân giải không bị ràng buộc với đối tượng Promise. –

+1

@arcseldon Bạn có thể làm 'getSectionFromDataPromise = R.pipe (getSectionFromData, Promise.resolve.bind (Promise));' –

9

Tôi biết, câu hỏi là cũ. Nhưng ramda có một số chức năng tuyệt vời để soạn các hàm trả lời hứa hẹn: pipePcomposeP.

Ngoài ra, hãy xem thường xuyên compose (pipe) và thực thi Kleisli composeK (pipeK). Chúng cho phép làm việc với các cấu trúc đại số như Future hoặc Task, trông giống như Promise, nhưng được đánh giá lười biếng.

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