如何使用来自另一个 HTTP 请求设置的可读存储的 header 'Authorization' 的值发出 HTTP 请求

How to make an HTTP request with the value for the header 'Authorization' coming from a readable store which is set by another HTTP request

我最初的 objective 是导入商店令牌并直接在 FinancialInstitution class 中使用它的值,而不是将其作为参数传递给函数,但是 none 的用法已按预期工作,get() 或 subscribe()。

我的 objective 仅在设置令牌存储后才向 listFinancialInstitutions() 发出单个请求。

目前发生的情况是发出了两次请求,第一次的初始值为空字符串,第二次是响应的结果。

我缺少什么才能获得我想要的行为?

所以我创建了一个名为 token.js:

的服务
export class Token {
    async createToken() {
        const init = {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Accept': 'application/json'
            },
            mode: 'cors'
        };
        return await fetch(`${middleware}/token`, init)
            .then((res) => res.json())
            .catch((err) => console.log(err));
    }
}

store.js:

import {readable} from 'svelte/store';
import {Token} from './services/token';

const tokenService = new Token();
export const token = readable('', set => {
    tokenService.createToken().then(res => set(res.access_token))
});

获取列表的服务:

export class FinancialInstitution {
    async listFinancialInstitutions(token) {
        // if (typeof token !== 'string') {
        //     return;
        // }
        const init = {
            method: 'GET',
            headers: {
                'Accept': 'application/json',
                'Authorization': `Bearer ${token}`
            },
            mode: 'cors'
        };
        return await fetch(`${middleware}/financial-institutions`, init)
            .then((res) => res.json())
            .catch((err) => console.log(err));
    }
}

苗条组件:

<script>
    import {FinancialInstitution} from '../services/financial-institution';
    import {token} from '../store';

    let financialsPromise;
    const financialService = new FinancialInstitution();
    token.subscribe(t => {
        financialsPromise = financialService.listFinancialInstitutions(t);
    })
</script>

<section>
    <h2>Financial Institutions</h2>
    {#await financialsPromise}
        <span>⏳ Fetching the list of financial institutions </span>
    {:then financials}
        <ul>
            {#each financials.data as financial}
                <li>{financial.id}</li>
            {/each}
        </ul>
    {:catch error}
        <p>Sorry but there's no data </p>
    {/await}
</section>
<style>
    ul {
        padding-left: 0;
    }

    ul li {
        list-style: none;
    }
</style>

当您使用空字符串初始化您的令牌存储时,订阅的组件将立即收到该值,这就是您看到此初始请求为空字符串的原因(即存储更新之前令牌的值使用 实际 令牌)。

为防止这种情况发生,您可以测试商店返回的值并采取相应措施:

    token.subscribe(t => {
        financialsPromise = t ? financialService.listFinancialInstitutions(t) : undefined;
    })

为了补充这一点,您还需要将承诺的呈现包装在条件中:

    {#if financialsPromise}
        {#await financialsPromise}
            <span>⏳ Fetching the list of financial institutions </span>
        {:then financials}
            <ul>
                {#each financials.data as financial}
                    <li>{financial.id}</li>
                {/each}
            </ul>
        {:catch error}
            <p>Sorry but there's no data </p>
        {/await}
    {/if}

以上回答正确。我做了一个简单的例子来演示订阅是如何执行两次的。

https://svelte.dev/repl/b1fa28b592854900a62dd4b18ca5d6b9?version=3.44.2