This repository was archived by the owner on Mar 18, 2025. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 53
This repository was archived by the owner on Mar 18, 2025. It is now read-only.
How to fetch data with an async call ? #40
Copy link
Copy link
Closed
Description
Hello,
I'm struggling at making a simple thing work : async data fetch. The documentation (https://svelte.nodegui.org/docs/guides/networking) explains how to write a function that make this async call, but not how to call it.
I've tried calling this async function directly in the (async) event handler of a button but the app crashes with FATAL ERROR: v8::HandleScope::CreateHandle() Cannot create a handle without a HandleScope.
If I try to use svelte await blocks like this :
<script lang="ts">
import { onMount } from "svelte";
import type { NSVElement, RNWindow } from "@nodegui/svelte-nodegui";
import { Direction } from "@nodegui/nodegui";
import fetch from "node-fetch";
/**
* The exact type for this is: NSVElement<RNWindow>
* ... However, the Svelte language tools erroneously expect all bind:this values to extend HTMLElement, so
* for now, we have to rely on reasserting the type.
*/
let win;
let urlWidget;
let dataPromise = loadData("https://reqres.in/api/products/3");
function loadPressed(){
dataPromise = loadData(urlWidget.textContent);
}
async function loadData(url){
try{
let response = await fetch(url);
let jsonResponse = await response.json();
return jsonResponse;
}
catch(error){
console.error(error);
}
}
onMount(() => {
(window as any).win = win; // Prevent garbage collection, otherwise the window quickly disappears!
(win as NSVElement<RNWindow>).nativeView.show();
return () => {
delete (window as any).win;
};
});
</script>
<window
bind:this={win}
windowTitle="Seafile Share link DL">
<view class="vertical">
<view class="horizontal">
<text>Share link url:</text>
<lineEdit id="lineEdit" bind:this={urlWidget}/>
<button text="Load" on:clicked={loadPressed}/>
</view>
<view>
{#await dataPromise}
<text>Nothing loaded</text>
{:then data}
<text>{data}</text>
{:catch error}
<text>{error.message}</text>
{/await}
</view>
</view>
</window>
<style>
/*
* CSS has a few gotchas for now.
* 1) Some values need to be enclosed with quotes (e.g. `width: '100%';` rather than `width: 100%;`).
* See: https://github.com/nodegui/svelte-nodegui/issues/4
* 2) Classes are not supported yet; they're a bit weird in Qt5.
See: https://github.com/nodegui/svelte-nodegui/issues/6
* 3) You can't write element-level rules like `text { color: 'red'; }`, unless they're global (not scoped).
* For scoped rules, you have to refer to the underlying native element, e.g. `QLabel { color: 'red'; }`.
* See: https://github.com/nodegui/svelte-nodegui/issues/7
*/
.vertical{
flex-direction: column;
}
.horizontal{
flex-direction: row;
}
#lineEdit{
flex: 1;
}
</style>
then I get a UnhandledPromiseRejectionWarning: ReferenceError: __awaiter is not defined...
What is the correct way to do ?
Metadata
Metadata
Assignees
Labels
No labels