Coder Social home page Coder Social logo

plugin-status's Introduction

介绍

CircleCI NPM Version NPM Downloads npm bundle size Coverage Status

Feature

  1. 基于事件驱动的状态机
  2. 依赖于 beautywe-plugin-event
  3. 支持 BtPage,BtApp

安装

$ npm i @beautywe/plugin-event
$ npm i @beautywe/plugin-status
import BeautyWe from '@beautywe/core';
import event from '@beautywe/plugin-event';
import status from '@beautywe/plugin-status';

const app = new BeautyWe.BtApp();

// status 插件依赖于 beautywe-plugin-event
app.use(event());

// 使用 status 插件
app.use(status({
    // options
}));

使用

beautywe-plugin-status 弥补了微信小程序生命周期钩子不支持异步阻塞的问题。

假设我们有这样一个场景:在应用启动的时候进行全局的数据获取和初始化,待成功后,各页面再进行初始化。

那么我们可能是这样写代码:

// on app.js
App({
    onLaunch() {
        API
            .fetch('xxx')
            .then(data => this.globalData = data);
    },
});

// on page.js
Page({
    onLoad() {
        // 在微信小程序中,onLoad 执行的时候,可能数据还没返回呢。
        const globalData = getApp().globalData;
        if (globaleData) this.initPage(globalData);
    },
});

在原生的小程序启动流程中,因为无论 app,page,component 的生命周期钩子函数,都不支持异步阻塞。
但是实际项目中,我们有大量的类似的实际场景需要满足:登录态的初始化,全局数据的初始化等等。

beautywe-plugin-status 基于事件驱动,来满足这一类的需求:

// on app.js
const app = BtApp({
    onLaunch() {
        API
            .fetch('xxx')
            .then(data => this.globalData = data)

            // 把状态机设置为 success
            .then(() => this.status.get('fetchGlobalData').success());
    },
});

app.use(status({
    statuses: ['fetchGlobalData'],
}));

App(app);

// on page.js
Page({
    onLoad() {
        getApp()
            .status.get('fetchGlobalData')

            // 监听一次成功状态事件
            .onceSuccess(() => {
                const globalData = getApp().globalData;
                if (globaleData) this.initPage(globalData);
            });
    },
});

原生启动流程 VS 事件驱动启动流程

状态机的获取,移除,注册,批量注册

// 批量注册(批量注册只能是在引入插件的时候)
app.use(status({
    statuses: [
        'abc',
        'def',
        'ghi',
    ],
}));

// 获取一个状态机实例
const statusInstance = app.status.get('abc');

// 移除一个状态机
app.status.remove('def');

// 新增一个状态机
app.status.add('jkl');

// 可以使用以下 api
statusInstance.success();
statusInstance.fail();
statusInstance.ing();
statusInstance.reset();
statusInstance.onceSuccess();
statusInstance.onceFail();
statusInstance.must();
statusInstance.isIng();
statusInstance.isSuccess();
statusInstance.isFail();

Class Status

状态机是一个 Class,所有状态机都是 Class Status 的实例。

一个状态机,有四种状态:

  • 未开始:un start (为状态机的初始态)
  • 进行中:ing
  • 成功:success
  • 失败:fail

实例的 api 主要分三类:

  • 状态改变
  • 状态监听
  • 状态判断

状态改变

  • Status.prototype.success:把状态机设置为 success
  • Status.prototype.fail:把状态机设置为 fail
  • Status.prototype.ing:把状态机设置为 ing
  • Status.prototype.reset:把状态机设置为 un start

状态监听

  • Status.prototype.onceSuccess:监听一次状态机成功的事件,监听会被注销
  • Status.prototype.onceFail:监听一次状态机失败的事件,触发过后,监听会被注销
  • Status.prototype.must:至少监听一次状态机成功的事件,过程中状态机失败了,会打印错误,然后监听下一次成功事件

状态判断

  • Status.prototype.isIng():当前状态机是否为 ing 状态,返回 true | false
  • Status.prototype.isSuccess():当前状态机是否为 success 状态,返回 true | false
  • Status.prototype.isFail():当前状态机是否为 fail 状态,返回 true | false

plugin-status's People

Contributors

jerryc8080 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.