Каков синтаксис для разрешения Thenable‹'t› в F# с использованием fable?

Я работаю над расширением vscode, написанным на F #, используя Fable для компиляции в javascript. Многие API возвращают обещание. Каков синтаксис для разрешения промиса с возвращаемыми типами, такими как Thenable<string[]> для F#?

Вот пример многих API для vscode: vscode API


person Korbin    schedule 02.08.2016    source источник


Ответы (2)


Посмотрите, как это делает Ionide:

https://github.com/ionide/ionide-vscode-helpers/blob/fable/Helpers.fs https://github.com/ionide/ionide-vscode-helpers/blob/fable/Fable.Import.VSCode.fs

По сути, похоже, что Ionide почти проигнорировал существование Thenable<T> и преобразовал каждый вызов API в Promise<T> в своих привязках Fable. У них есть пара функций toPromise и toThenable в Helpers.fs, но я не вижу, чтобы они использовались где-либо во всем https://github.com/ionide/ionide-vscode-fsharp репозиторий.

У меня нет личного опыта работы с Fable, поэтому, если этого недостаточно, чтобы ответить на ваш вопрос, надеюсь, кто-то еще предоставит дополнительную информацию.

person rmunn    schedule 02.08.2016
comment
Да, я видел эти примеры. Однако на самом деле я не видел, как на самом деле разрешались промисы (как вы упомянули, что они не использовались), потому что типы не совпадают. Я должен что-то упустить. - person Korbin; 03.08.2016

После некоторой игры с синтаксисом я смог понять это с помощью подсказки, которую дал rmunn при преобразовании Thenable в Promise.

module PromiseUtils =
  let success (a : 'T -> 'R) (pr : Promise<'T>) : Promise<'R> =
      pr?``then`` (unbox a) |> unbox

  let toPromise (a : Thenable<'T>) = a |> unbox<Promise<'T>>

  let toThenable (a : Promise<'T>) = a |> unbox<Thenable<'T>>

Используя приведенный выше служебный модуль, я смог преобразовать функции, возвращающие Thenable, в Promises, чтобы их можно было повторно использовать.

  let result = commands.getCommands ()
               |> PromiseUtils.toPromise
               |> PromiseUtils.success (fun item -> 
                  let firstOne = item.Item 1
                  console.log(firstOne))
person Korbin    schedule 03.08.2016