@42px/effector-extra 中文文档教程

发布于 3年前 浏览 33 项目主页 更新于 3年前

Effector extra

有用的效应器实用程序。

Installation

npm install @42px/effector-extra

Utils

attachWrapper

通常您需要使用包装的参数、结果或错误创建衍生效果:

import { attachWrapper } from '@42px/effector-extra'
import { requestFx, Res } from '../request'

type LoginParams = {
  username: string
  password: string
}

type LoginResult = {
  token: string
}

const loginReqFx = attachWrapper({
    effect: requestFx,
    mapParams: (params: LoginParams) => ({
        method: "POST",
        body: params,
    }),
    mapResult: ({ result }): Res<LoginResult> => result.data,
    mapError: ({ error }) => {
        if (error.code === 404) {
          const err = new Error()
          err.name = "InvalidCredentials"
          return err
        }
        return error
    },
})

createService

const domain = createDomain()
// real request effect
const requestFx = domain.effect<ReqParams, Response, Error>()

const myService = createService({
    domain: createDomain(),
    effect: requestFx,
})

// some method
const getNewsFx = myService.createMethod({
    mapParams: (newsId: number) => ({
        url: `/news/${newsId}`,
    }),
    mapResult: ({ result }) => result.data,
})

Event batcher

当您有许多事件的不一致流时,此实用程序很有用。 如果事件序列的触发速度快于定义的延迟,它会在数组中批量处理事件有效负载。 否则事件立即触发

import { batchEvents } from '@42px/effector-extra'
import { matrixDomain } from './domain'

export const roomMessage = matrixDomain.event<MessageEvent>()
export const roomMessageBatch = batchEvents(roomMessage, 500)

mockEffects/mockStores

使用 fork 时模拟效果的类型安全助手(对测试有用):

const mockCartStorage = () => {
  let cartStorage: CartItem[] = [] 

  return mockEffects()
    .set(writeCartFx, (cart) => {
      cartStorage = cart
    })
    .set(readCartFx, () => cartStorage)
}

let scope: Scope


test('add to cart', async () => {
  scope = fork(root, {
    handlers: mockCartStorage(),
  })
})

Effector extra

Helpful effector utils.

Installation

npm install @42px/effector-extra

Utils

attachWrapper

Often you need to create a derivative effect with wrapped params, result or error:

import { attachWrapper } from '@42px/effector-extra'
import { requestFx, Res } from '../request'

type LoginParams = {
  username: string
  password: string
}

type LoginResult = {
  token: string
}

const loginReqFx = attachWrapper({
    effect: requestFx,
    mapParams: (params: LoginParams) => ({
        method: "POST",
        body: params,
    }),
    mapResult: ({ result }): Res<LoginResult> => result.data,
    mapError: ({ error }) => {
        if (error.code === 404) {
          const err = new Error()
          err.name = "InvalidCredentials"
          return err
        }
        return error
    },
})

createService

const domain = createDomain()
// real request effect
const requestFx = domain.effect<ReqParams, Response, Error>()

const myService = createService({
    domain: createDomain(),
    effect: requestFx,
})

// some method
const getNewsFx = myService.createMethod({
    mapParams: (newsId: number) => ({
        url: `/news/${newsId}`,
    }),
    mapResult: ({ result }) => result.data,
})

Event batcher

This util is useful when you have a non-consistent flow of many events. It batches events payload in array if the sequence of events are fired faster then defined delay. Otherwise event fired immediatly

import { batchEvents } from '@42px/effector-extra'
import { matrixDomain } from './domain'

export const roomMessage = matrixDomain.event<MessageEvent>()
export const roomMessageBatch = batchEvents(roomMessage, 500)

mockEffects/mockStores

Type-safe helper for mock effects when using fork (useful for testing):

const mockCartStorage = () => {
  let cartStorage: CartItem[] = [] 

  return mockEffects()
    .set(writeCartFx, (cart) => {
      cartStorage = cart
    })
    .set(readCartFx, () => cartStorage)
}

let scope: Scope


test('add to cart', async () => {
  scope = fork(root, {
    handlers: mockCartStorage(),
  })
})
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文