2017-11-07 12 views
1

Ich bin neu in Reason, derzeit versucht, ein persönliches Projekt von js in Grund zu konvertieren. Meistens war es einfach weit weg von asynchronen Sachen. Ich kann meine Funktion nicht rekursiv mit Verzögerung aufrufen. Ich habe eine Funktion, die getPrice Verwenden von Versprechen mit setTimeout

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

ich ein Versprechen von int

zurück wollen checkPrice eine andere Funktion machen, die von bestimmten Benutzer Preis den aktuellen Preis prüft endlos, es sei denn Bedingung erfüllt ist.

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

Aber ich bin Typenkonflikt immer setTimeout sagte

vom Typ Einheit sein sollte
+0

Vermeiden Sie die [ 'Promise' Konstruktor Antipattern] (https://stackoverflow.com/q/23803743/ 1048572? Was-ist-die-Verheißung-Konstruktion-Antipattern-und-wie-vermeide-es! Erstellen Sie eine separate Hilfsfunktion, die eine Verheißung für das Zeitlimit zurückgibt, und verwenden Sie die Verkettungsverkettung. – Bergi

Antwort

-2

Der Js.Promise API ist leider absolut schrecklich, vor allem, weil das JS-API einfach nur unvernünftig ist, aber es ist nicht sehr gut durchdacht auf die Vernunftseite entweder. Es könnte einige Convenience-Korrekturen geben, die zu Js.Promise kommen, aber hoffentlich wird das Ganze in nicht allzu ferner Zukunft durch eine richtige Lösung ersetzt.

Im Hier und jetzt aber werden Sie, so etwas zu tun haben:

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

ahh habe es jetzt, Vielen Dank für die Erklärung Ja async (Versprechungen) sind der einzige Teil, der jetzt cringeworthy ist, Rest ist eine absolute Freude Auch fragen, kann der Typ Checker mich zwingen, Catch-Aussagen für Versprechen zu schreiben? Wie es für nicht vollständige Muster Übereinstimmungen gibt? – user17472

+0

Es kann, und es gibt sogar eine Bibliothek Verpackung Versprechen, dass dies tut: https://github.com/wokalski/vow – glennsl

Verwandte Themen