2017-11-07 27 views
1

저는 개인 프로젝트를 js에서 reason로 변환하려고하는 Reason을 처음 접했습니다. 대부분 비동기적인 것들과는 별개로 쉽습니다. 지연과 함께 재귀 적으로 내 함수를 호출 할 수 없습니다. 나는 INTsetTimeout과 함께 약속 사용하기

type getPrice = unit => Js.Promise.t(int) 

나는 조건이 충족 끝없이하지 않는 한 지정된 사용자 가격 현재 가격을 확인 다른 함수 checkPrice을 만들고 싶어의 약속을 반환하는 함수 getPrice 있습니다.

let rec checkPrice = (userPrice) => 
    Js.Promise.(
    getPrice() 
    |> then_(
    (currentPrice) => 
     if (currentPrice >= userPrice) { 
     resolve(currentPrice) 
     } else { 
     /* call this function with setTimeout */ 
     checkPrice(userPrice) 
     } 
    ) 
); 

그러나 나는 형 유닛으로해야 setTimeout을 말하는 형식이 일치를 얻고있다

+0

가 ['Promise' 생성자 안티 패턴] 피 (https://stackoverflow.com/q/23803743/ : 지금 여기에서

그러나, 당신은 이런 식으로 뭔가를해야 할 것이다 1048572 - 약속 - 건설 - 반 패턴 및 피할 수있는 방법)! 시간 제한에 대한 약속을 반환하는 별도의 도우미 함수를 만든 다음 약속 체인을 사용합니다. – Bergi

답변

-2

Js.Promise API는 JS API는 그냥 일반 건전 주로하기 때문에, 불행히도 절대적으로 끔찍한이지만, 그것은 아주 잘 밖으로 생각이 아니다 이유 측면. Js.Promise에는 몇 가지 편의 픽스가있을 수 있지만 너무 먼 미래에는 적절한 솔루션으로 대체 될 수 있기를 바랍니다.

external toExn : Js.Promise.error => exn = "%identity"; 

let rec checkPrice = (userPrice) => 
    Js.Promise.(
    getPrice() 
    |> then_(
    (currentPrice) => 
     if (currentPrice >= userPrice) { 
     resolve(currentPrice) 
     } else { 
     Js.Promise.make((~resolve, ~reject) => 
      Js.Global.setTimeout(
      fun() => 
       checkPrice(userPrice) 
       |> then_((v) => [@bs] resolve(v) |> Js.Promise.resolve) 
       |> catch((e) => [@bs] reject(toExn(e)) |> Js.Promise.resolve) 
       |> ignore, 
      0 
      ) |> ignore 
     ) 
     } 
    ) 
); 
+0

아, 이제 설명해 주셔서 감사합니다. 예 비동기 (약속)는 지금 당장 주목할만한 유일한 부분입니다. 나머지는 절대 기쁨입니다. 궁금한 점이 있으시면 타입 검사기를 사용하여 약속 잡기 문을 쓸 수 있습니까? 철저한 패턴 일치는 아닌가요? – user17472

+0

그것은 할 수 있고, 도서관 포장 약속조차있다 : https://github.com/wokalski/vow – glennsl