导出函数是否会创建该函数的单例?

时间:2018-08-13 07:12:51

标签: javascript typescript singleton

我正在尝试在我的API之上实现抽象。我需要一个axios客户端的实例,以便以后可以拦截请求。使用下面的代码,我尝试重用同一实例。当我在视图层中导入函数(即身份验证)时,下面的代码是否保证只有一个axios客户端?如果是这样,为什么?

index.ts

import axios from 'axios'

export const baseUrl = 'http://localhost:8080';
export const axiosClient = axios.create();

session.ts

import {axiosClient, baseUrl} from './index'
import {User} from "../_models/user";

interface AuthenticateResponse {
    token: string,
    user: User
}

export function authenticate(username: string, password: string) :Promise<User> {
    let formData = new FormData();
    formData.set('username', username);
    formData.set('password', password);

    return axiosClient.post(baseUrl + '/login', formData)
        .then(resp => {
            let authResp: AuthenticateResponse = JSON.parse(resp.data);

            localStorage.setItem('token', authResp.token);
            return authResp.user
        })
}

1 个答案:

答案 0 :(得分:0)

如果出于某种原因未从两个不同的位置导入index模块,则应该没问题,因为模块是根据其文件名加载的。如果require解析为相同的文件名,它将返回相同的模块,并且该代码仅应执行一次,并且单例仅应实例化一次。

https://nodejs.org/api/modules.html#modules_module_caching_caveats

大多数前端框架都提供了处理单例的机制。一些例子:

https://angular.io/guide/singleton-services

https://github.com/mobxjs/mobx-react#provider-and-inject

我个人不会依靠require来创建单例。最好使用Web框架机制或以某种方式调整架构,以使应该是单例的对象通过层次结构传递。

将函数传递给authenticate可能是一个主意,该函数在请求返回后或您需要时执行。