npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-studio

v1.0.0

Published

异步流控制

Downloads

4

Readme

异步流控制

开始的唠叨

小代码本来没想上传,夜里看博客,写的关于js流控制,感觉思想比较传统。
我个人不太喜欢用Promise(可能是我英文不好,这个词我总记不住),所以在自己开发项目的时候写的这么一套流程控制。
我也没有博客,就放在这里随便唠叨一下。

附带支持有局限的热更新

安装

npm install node-studio

设计思想

就比如有一个14岁的小明,他在边吃草莓冰淇淋,边走路,那么他的结构是:
class 人
    - instance 人
        - prop 姓名: 小明
        - prop 年龄: 14
        - procedure 吃冰淇淋
            - prop 冰淇淋.口味: 草莓
            - prop 冰淇淋.剩余: 1

            - step1 []                        把冰淇淋到嘴边
            - step2 [把冰淇淋到嘴边完成]        吃一口 && 冰淇淋.剩余 -= 0.3
            - step3 [吃一口完成]                把手拿走 && 慢慢吃
            - step4 [慢慢吃完成]                还有冰淇淋么 ? 回到step1 : 退出流程

            - 退出的时候记得把东西扔进垃圾箱
        - procedure 走路
            - step1 []                        左脚运动
            - step2 [左脚运动完成]            右脚运动
            - step3 [右脚运动完成]            回到step1
用代码来表示:
{
    owner: {
        姓名: '小明',
        年龄: 14,
    },
    procedures: {
        吃冰淇淋: [
            function() {
                console.log( '我叫' + this.owner.姓名 + ',今年' + this.owner.年龄 + '岁。' );
                console.log( '我在吃一个' + this.冰淇淋.口味 + '味的冰淇淋' );
            },
'start:',                        // 这就我的最爱,幸福的goto label
            function() {
                console.log( '把冰淇淋到嘴边' );
                setTimeout( () => this.inform( '手', '把冰淇淋到嘴边完成' ), 100 );
            },
            {
                把冰淇淋到嘴边完成: function() {
                    console.log( '吃一口' );
                    setTimeout( () => this.inform( '嘴', '吃一口完成', Date.now() ), 100 );
                },
            },
            {
                吃一口完成: function( sender, time ) {
                    if ( sender === '嘴' ) {
                        console.log( '吃的时间' + time );
                        console.log( '把手拿走' );
                        setTimeout( () => this.inform( '手', '把手拿走完成' ), 100 );
                        this.冰淇淋.剩余 -= 0.3;
                        console.log( '慢慢吃' );
                        setTimeout( () => this.inform( '嘴', '慢慢吃完成' ), 1000 );
                    }
                },
            },
            {
                慢慢吃完成: function() {
                    if ( this.冰淇淋.剩余 <= 0 ) {    // 别问我冰淇淋剩余为什么会是负的,可能吃到手指了吧
                        return '@exit';        // 退出过程
                    } else {
                        return '@start';    // 幸福的goto
                    }
                },
            },
'exit:',
            function() {
                console.log( '丢进垃圾箱' );
            },
        ],
        走路: [
'start:',
            '[左脚迈步]',    // 这里是说明
            function() {
                console.log( '左脚运动' );
                setTimeout( () => this.inform( '左脚', '左脚运动完成' ), 1000 );
            },
            {
                左脚运动完成: function() {
                    this.comment = '右脚迈步';        // 也可以这样设置说明
                    console.log( '右脚运动' );
                    setTimeout( () => this.inform( '右脚', '右脚运动完成' ), 1000 );
                },
            },
            '右脚运动完成',        // 这样也可以接收事件
            '@start',
        ],
    },
}
这就是我的设计思路。
这个时候问题来了,如果有人过来跟小明说话,应该怎么办?
中断,具体代码在示例中。

示例


// person.js

const studio = require( 'node-studio' );

module.exports = {
    owner: {
        姓名: null,
        年龄: 0,
    },
    procedures: {
        有人搭讪: [
            function() {
                this.owner.inform( null, '搭讪' );  // 这个事件通知是全局事件通知
                console.log( '%% 有人搭讪了' );
            },
            2000,            // 聊了2秒的天
            function() {
                this.owner.inform( null, '搭讪完成' );
                console.log( '%% 拜拜~' );
                // 不用 return '@exit' 最后会退出
            },
        ],
        吃冰淇淋: [
            '.interrupts',
            {
                搭讪: '@被人搭讪了',            // 等于   搭讪: () => '@被人搭讪了'
            },

            function() {
                this.第几口 = 0;
                console.log( '我叫' + this.owner.姓名 + ',今年' + this.owner.年龄 + '岁。' );
                console.log( '我在吃一个' + this.冰淇淋.口味 + '味的冰淇淋' );
            },
'start:',                        // 这就我的最爱,幸福的goto label
            function() {
                console.log( '把冰淇淋到嘴边' );
                setTimeout( () => this.inform( '手', '把冰淇淋到嘴边完成' ), 100 );
            },
            {
                把冰淇淋到嘴边完成: function() {
                    console.log( '吃一口' );
                    setTimeout( () => this.inform( '嘴', '吃一口完成', ++this.第几口 ), 100 );
                },
            },
            {
                吃一口完成: function( sender, number ) {
                    if ( sender === '嘴' ) {
                        console.log( '把手拿走' );
                        setTimeout( () => this.inform( '手', '把手拿走完成' ), 100 );
                        this.冰淇淋.剩余 -= 0.3;
                        console.log( '慢慢吃,第' + number + '口' );    // 其实可以直接用 this.第几口 我只是想试一下传递参数
                        setTimeout( () => this.inform( '嘴', '慢慢吃完成' ), 1000 );
                    }
                },
            },
            {
                慢慢吃完成: function() {
                    if ( this.冰淇淋.剩余 <= 0 ) {    // 别问我冰淇淋剩余为什么会是负的,可能吃到手指了吧
                        return '@exit';        // 退出过程
                    } else {
                        console.log( '冰淇淋还有' + this.冰淇淋.剩余 );
                        return '@start';    // 幸福的goto
                    }
                },
            },
'被人搭讪了:',
            {
                搭讪完成: '@start',
            },
'exit:',
            function() {
                console.log( '丢进垃圾箱' );
            },
        ],
        走路: [
            '.interrupts',
            {
                搭讪: '@被人搭讪了',
            },

'start:',
            '[左脚迈步]',    // 这里是说明
            function() {
                console.log( '-- 左脚运动' );
                setTimeout( () => this.inform( '左脚', '左脚运动完成' ), 1000 );
            },
            {
                左脚运动完成: function() {
                    this.comment = '右脚迈步';        // 也可以这样设置说明
                    console.log( '-- 右脚运动' );
                    setTimeout( () => this.inform( '右脚', '右脚运动完成' ), 1000 );
                },
            },
            '右脚运动完成',        // 这样也可以接收事件
            '@start',

'被人搭讪了:',
            {
                搭讪完成: '@start',
            },
        ],
    },
};

// index.js

const studio = require( 'node-studio' );

studio.require( 'person', __dirname + '/person.js' );
var xiaoming = studio.worker( 'person', '这个id随便', { 姓名: '小明', 年龄: 14 } );
xiaoming.procedure( null, '吃冰淇淋', { 冰淇淋: { 口味: '草莓', 剩余: 1 } } );
xiaoming.procedure( null, '走路', {} );

setTimeout( () => xiaoming.procedure( null, '有人搭讪', {} ), 1000 );
setTimeout( () => xiaoming.procedure(), 10000 );        // 终止全部

// 这里延时可以有局限的热更新
// setTimeout( () => studio.require( 'person', __dirname + '/person.js' ), 10000 );

写在最后

还有一些有趣的用法我就不写了,反正也没人用,我也就是自娱自乐,如果你有兴趣,可以加我qq,你猜我qq是多少?