Svelte:如何处理组件中自定义可写存储的异步初始化承诺?

2024-01-03

我有几个 Svelte 组件和一个自定义可写存储。店里有一个init函数是async并用一些 REST API 的数据库表的数据填充存储的值。我的组件都必须使用自动订阅来订阅该商店。订阅时,init必须被调用。总体思路是在数据库上实现 CRUD 操作,在存储上实现 CRUD 操作(有助于显示存储的值,i.e.数据库的表,具有反应性)。

As init is async因此,返回一个承诺,我需要await它在我的组件中。但由于我使用自动订阅(通过在商店名称前加上前缀)$), 我怎样才能做到这一点?

例如:App.svelte(组件):

<script>
    import { restaurant_store } from './Restaurant.js'
    export let name
</script>

<main>
    
    <!--- I need to handle the promise and rejection here -->
    {#each $restaurant_store as restaurant}
        <li>
            {restaurant.name}
        </li>
    {/each}
    

</main>

Restaurant.js(商店):

import { writable } from 'svelte/store'

export function createRestaurantsStore() {
    const { subscribe, update } = writable({ collection: [] })

    return {
        subscribe,

        init: async () => {
            const response = await fetch('http://localhost:1337/restaurants')

            if(response.ok) {
                const json_response = await response.json()
                set({ collection: json_response })
                return json_response
            }

            throw Error(response.statusText)
        },

        insert: async (restaurant) => {
            const response = await fetch('http://localhost:1337/restaurants', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(restaurant)
            })

            if(response.ok) {
                const json_response = await response.json()
                update(store_state => store_state.collection.push(json_response))
                return json_response
            }

            throw Error(response.statusText)
        },

        update: async (restaurant, id) => {
            const response = await fetch('http://localhost:1337/restaurants/' + id, {
                method: 'PUT',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(restaurant)
            })

            if(response.ok) {
                const json_response = await response.json()
                update(store_state => {
                    const current_id = store_state.collection.findIndex(e => e.id === id)
                    store_state.collection.splice(current_id, 1, json_response)
                })
                return json_response
            }

            throw Error(response.statusText)

        }

    }
}

export const restaurant_store = createRestaurantsStore()

Svelte 提供了内置机制 https://svelte.dev/docs#template-syntax-await处理模板中可能的 Promise 状态,因此可能如下所示:

<main>
    {#await restaurant_store.init()}
        <p>waiting for the promise to resolve...</p>
    {:then}
      {#each $restaurant_store as restaurant}
        <li>
          {restaurant.name}
        </li>
      {/each}
    {:catch error}
        <p>Something went wrong: {error.message}</p>
    {/await}
</main>

结帐REPL https://svelte.dev/repl/9545e8959d63499b92a1073ae2fe1600?version=3.43.1举个例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Svelte:如何处理组件中自定义可写存储的异步初始化承诺? 的相关文章

  • 来自 Javascript 的 Svelte Mount DOM 元素

    我正在尝试安装一个pixi js画布与 Svelte 如下所示 app view is an HTML Canvas元素 但我不知道如何用 Svelte 显示它
  • 如何返回 Svelte 组件的渲染 HTML?

    我很难制作一个会消失的工具提示use action 我的要求是 创建以 HTML 或组件为内容的工具提示 无需将组件包装在
  • Svelte/Typescript 错误:类型声明期间出现“意外标记”

    所以我有一个Svelte启用了 TypeScript 的应用程序 但现在我在运行它时遇到问题 Error Unexpected token Note that you need plugins to import files that ar
  • 从 Svelte 组件导出单独的自定义元素

    我试图找出是否可以将每个 Svelte 组件作为单独的自定义元素 带有 Shadow DOM 导出到其自己的 js 文件中 导入任何子元素 即依赖项不包含在同一文件中 有可能吗 Thanks 我假设你正在使用rollup and rollu
  • 平滑地调整容器大小

    我已经使用 svelte 一段时间了 它很棒 但有一件事我一次又一次地遇到 我们来看下面的代码 div class this div should smoothly change size each list as item item di
  • context="module" 在 Svelte 和 Sapper 中如何工作?

    当我使用 Sapper 构建项目时 每当我从服务器获取数据时 预加载函数都会在 script context module 内部声明 如下所示 根据document
  • Sveltekit:使用 $page.path 设置活动链接的样式

    我正在开发一个 sveltekit 应用程序 其侧导航包含链接 我无法使链接上的活动类样式正常工作 链接是以下组件NavLink svelte a class link href gt a
  • 从 file:// 运行 Svelte 应用程序,无需服务器

    我需要运行一个 Svelte 应用程序并且能够在没有服务器的情况下执行它 对于其他框架 这是可能的 因为它只是 javascript 但我找不到一种方法来单击我的 index html 并运行用 Svelte 构建的应用程序 我需要运行一个
  • 使用 AWS Amplify 部署静态 Svelte-Kit 应用程序

    我正在尝试在 AWS Amplify 上部署我的 Svelte 应用程序 我推送提交 Amplify 构建并验证应用程序 但如果我访问应用程序 URL 它只是一个空白页面 这可能是适配器问题 我尝试了 node js 和静态的 但没有成功
  • svelte 包应该是依赖项还是 devDependency?

    我知道已经有很多帖子讨论了两者之间的区别dependency and devDependency但我没有找到任何解释 svelte 情况的信息 所以让我们在这里打开这个 在大多数 svelte 包中 比如svelte 材质 ui https
  • 当我添加到数组时,svelte 列表不会更新

    我刚刚开始使用 svelte 所以 这可能是一个菜鸟问题 我有一个列表 我可以从数组中删除项目 并且列表 each 更新没有问题 但是如果我将一个项目添加到数组中 列表不会重新绘制 直到我删除另一个项目 https svelte dev r
  • Svelte商店功能更新

    Svelte 存储文档显示正在更新字符串或整数 但我没有在存储中找到任何动态函数 我不明白如何制作getData作为可写函数以通知 html 发生的变化 在下面的示例中 我想b后显示updateKey函数被调用 您将在此处找到 REPL 中
  • 如何触发/强制更新 Svelte 组件

    我正在尝试了解 svelte 3 反应性的事情 我想在单击按钮时强制刷新用户界面 我正在使用自定义组件AsyncFetcher接受 HTTP post 数据并返回data其插槽的对象 http post 结果 我想要一个禁用功能 因此 当单
  • 如何在Svelte中动态渲染组件?

    我试图循环遍历一个数组来渲染具有以下值的组件type each contents as content lt content type gt each 期望的输出
  • 如何将原始二进制数据转换为 blob 并将其显示在 img 标记中?

    我正在 Electron 和 Svelte 中制作梦想日记应用程序 我有一种自定义文件格式 其中包含标题 描述和一张或多张图像 看 程序输入 文件输出 当我需要的时候 我可以打电话ipcRenderer invoke 在主进程中读取文件 然
  • 如何在 Svelte 中将 css 从 node_modules 添加到 template.html

    我有一个 sapperjs 应用程序 就像您通过调用获得的应用程序一样npx degit sveltejs sapper template my app 我想添加一种字体 普通人可能会添加这样一行app template html 网络原因
  • 迁移到 SvelteKit 的新路由系统

    不知道你怎么想 但我听说过 SvelteKit 中的这个新路由系统 我第一次听说这个是与 error svelte我在此处找到的文件官方文档 https kit svelte dev docs routing error 不久 我还看到了其
  • 是否有可能以某种方式直接更改派生存储的值?

    我目前正在使用 SvelteKit 我有一个derivedstore 这是必要的 因为它依赖于另一个商店 现在我需要更改一些值derived直接存储 问题是derived据我的理解 商店是不可修改的 有没有办法改变a的值derived直接存
  • 如何将数据从布局传递到 Sapper 中的页面?

    在 Svelte 中你可以通过插槽中内容的道具 https svelte dev tutorial slot props
  • 如何向 SvelteKit/Vite 应用添加版本号?

    我正在尝试在我的 SvelteKit 应用程序中创建一个系统 它会在某个页面上向您显示有关当前应用程序版本的信息 最好是 Git 提交哈希和描述 我尝试使用Vite的定义功能 https vitejs dev config define在构

随机推荐