Есть ли конструктор выражений для Promises? - PullRequest
0 голосов
/ 17 апреля 2020
async function showSampleText(context: vscode.ExtensionContext): Promise<void> {
    let sampleTextEncoded = await vscode.workspace.fs.readFile(vscode.Uri.file(context.asAbsolutePath('sample.txt')));
    let sampleText = new TextDecoder('utf-8').decode(sampleTextEncoded);
    let doc = await vscode.workspace.openTextDocument({ language: 'plaintext', content: sampleText });
    vscode.window.showTextDocument(doc);
}

Я перевел приведенный выше фрагмент Typecript на следующий код Fable.

type ITextDecoder =
    abstract member decode: ?input: Uint8Array * ?options: {| stream : bool |} -> string

[<Emit("new TextDecoder($0)")>]
let TextDecoder label : ITextDecoder = jsNative

let show_sample_text (ctx : Vscode.ExtensionContext) = 
    async {
        let! sampleTextEncoded = Vscode.workspace.fs.readFile(statics.Uri.file(ctx.asAbsolutePath("sample.txt"))) |> Async.AwaitPromise
        let sampleText = TextDecoder("utf-8").decode(sampleTextEncoded);
        let! doc = workspace.openTextDocument(options= !!{| language="plaintext"; content=sampleText |}) |> Async.AwaitPromise
        let! _ = window.showTextDocument(document=doc,options=undefined) |> Async.AwaitPromise
        return ()
    } |> Async.StartAsPromise

Меня беспокоит, как я явно конвертирую между Async и Promise с. Есть ли где-нибудь специально для Promises конструктор?

1 Ответ

1 голос
/ 20 апреля 2020

Fable поддерживает promise через пакет Fable.Promise.

Если вы добавите пакет Fable.Promise в свой проект, то вы можете делать такие вещи:

let private getRandomUser () = promise {
    // Do something here
    // ...
    return ()
}
...