【问题标题】:Does exporting a function creates a singleton of the function?导出函数会创建函数的单例吗?
【发布时间】:2018-08-13 07:12:50
【问题描述】:

我正在尝试在我的 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
        })
}

【问题讨论】:

  • 你导出的就是你得到的——在你的情况下,你导出一个对象的实例,该实例在所有其他导入中都是相同的实例(所以是一个单例)。其他选择是导出一个创建对象的函数,这样你就可以避免单例,但你必须在每次导入后创建实例,因为你要导入“工厂”。

标签: javascript typescript singleton


【解决方案1】:

如果您的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 可能是个好主意,该函数在请求返回后或您需要时执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多