Nodejs Guides(四)

EVENTS

events模块API实例 

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
}
//EventListener 会按照监听器注册的顺序同步地调用所有监听器。
//所以需要确保事件的正确排序且避免竞争条件或逻辑错误。
//监听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
    setImmediate(() => {
        console.log('这个是异步发生的');
    });
});
myEmitter.on('event1', () => {
    console.log('触发了一个事件1!');
});
myEmitter.on('event2', () => {
    console.log('触发了一个事件2!');
});
//eventEmitter.once() 方法时可以注册一个对于特定事件最多被调用一次的监听器。 当事件被触发时,监听器会被注销,然后再调用。
let m = 0;
myEmitter.once('event3', () => {
    console.log(++m);
});
//当EventEmitter 实例中发生错误时,会触发一个 'error' 事件。 这在 Node.js 中是特殊情况。
//最佳实践,应该始终为 'error' 事件注册监听器。
myEmitter.on('error', (err) => {
    console.error('有错误');
});
//emitter.prependListener() 方法可用于将事件监听器添加到监听器数组的开头。
myEmitter.prependListener('event', () => console.log('b'));
//添加一个单次 listener 函数到名为 eventName 的事件的监听器数组的开头。 下次触发 eventName 事件时,监听器会被移除,然后调用。
myEmitter.prependOnceListener('event', (stream) => {
    console.log('c');
});
myEmitter.emit('error', new Error('whoops!'));
myEmitter.emit('event3');
myEmitter.emit('event3');
myEmitter.emit('event');
myEmitter.emit('event2');
myEmitter.emit('event1');
myEmitter.emit('event');
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();

//this指向MyEmitter
// myEmitter.on('event', function (a, b) {
//     console.log(a, b, this);
// });

//this指向空对象
myEmitter.on('event', (a, b) => {
    console.log(a, b, this);
    // 打印: a b {}
});

myEmitter.emit('event', 'a', 'b');
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
}

const myEmitter = new MyEmitter();
// 当EventListener 所注册的事件发生的时候,该方法会被调用
myEmitter.once('newListener', (event, listener) => {
    if (event === 'event') {
        // 在开头插入一个新的监听器
        myEmitter.on('event', () => {
            console.log('B');
        });
    }
});
myEmitter.on('event', () => {
    console.log('A');
});
myEmitter.emit('event');
myEmitter.emit('event');
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {
}
const myEmitter = new MyEmitter();
// 在事件触发后、最后一个监听器完成执行后,从名为 eventName 的事件的监听器数组中移除指定的 listener。
const callbackA = () => {
    console.log('A');
    myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
    console.log('B');
};
myEmitter.on('event', callbackA);

myEmitter.on('event', callbackB);

myEmitter.emit('event');
myEmitter.emit('event');

URL

WHATWG URL API实例

const {URL} = require('url');
const myURL1 =
    new URL('https://abc:xyz@example.com');
console.log(myURL1);

const myURL2 = new URL('/foo', 'https://example.org/');
console.log(myURL2);


const myURL3 = new URL('https://example.org/abc?asd=abc');
console.log(myURL3.searchParams);

const myURLs = [
    new URL('https://www.example.com'),
    new URL('https://test.example.org')
];
console.log(JSON.stringify(myURLs));

// ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
// │                                            href                                             │
// ├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
// │ protocol │  │        auth         │        host         │           path            │ hash  │
// │          │  │                     ├──────────────┬──────┼──────────┬────────────────┤       │
// │          │  │                     │   hostname   │ port │ pathname │     search     │       │
// │          │  │                     │              │      │          ├─┬──────────────┤       │
// │          │  │                     │              │      │          │ │    query     │       │
// "  https:   //    user   :   pass   @ sub.host.com : 8080   /p/a/t/h  ?  query=string   #hash "
// │          │  │          │          │   hostname   │ port │          │                │       │
// │          │  │          │          ├──────────────┴──────┤          │                │       │
// │ protocol │  │ username │ password │        host         │          │                │       │
// ├──────────┴──┼──────────┴──────────┼─────────────────────┤          │                │       │
// │   origin    │                     │       origin        │ pathname │     search     │ hash  │
// ├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
// │                                            href                                             │
// └─────────────────────────────────────────────────────────────────────────────────────────────┘
const {URL, URLSearchParams} = require('url');
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
myURL.searchParams.append('abc', 'xyz');
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
const newSearchParams = new URLSearchParams(myURL.searchParams);
newSearchParams.append('a', 'c');
myURL.search = newSearchParams;
console.log(myURL.href);
const {URL, URLSearchParams} = require('url');
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
myURL.searchParams.append('abc', 'xyz');
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
const newSearchParams = new URLSearchParams(myURL.searchParams);
newSearchParams.append('a', 'c');
myURL.search = newSearchParams;
console.log(myURL.href);
//在数组的形式中,重复的键是不允许的。
const params = new URLSearchParams({
    user: 'abc',
    query: ['first', 'second']
});
console.log(params.getAll('query'));
console.log(params.toString());


//iterable <Iterable> 一个元素时键值对的迭代对象
let params;
// Using an array
params = new URLSearchParams([
    ['user', 'abc'],
    ['query', 'first'],
    ['query', 'second']
]);
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'

// 使用Map对象
const map = new Map();
map.set('user', 'abc');
map.set('query', 'xyz');
params = new URLSearchParams(map);
console.log(params.toString());
// 输出 'user=abc&query=xyz'

// 使用generator函数
function* getQueryPairs() {
    yield ['user', 'abc'];
    yield ['query', 'first'];
    yield ['query', 'second'];
}
params = new URLSearchParams(getQueryPairs());
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'

// 每个键值对必须有两个元素
new URLSearchParams([
    ['user', 'abc', 'error']
]);
// 抛出 TypeError [ERR_INVALID_TUPLE]:
//        每一个键值对必须是迭代的[键,值]元组
//在数组的形式中,重复的键是不允许的。
const params = new URLSearchParams({
    user: 'abc',
    query: ['first', 'second']
});
console.log(params.getAll('query'));
console.log(params.toString());


//iterable <Iterable> 一个元素时键值对的迭代对象
let params;
// Using an array
params = new URLSearchParams([
    ['user', 'abc'],
    ['query', 'first'],
    ['query', 'second']
]);
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'

// 使用Map对象
const map = new Map();
map.set('user', 'abc');
map.set('query', 'xyz');
params = new URLSearchParams(map);
console.log(params.toString());
// 输出 'user=abc&query=xyz'

// 使用generator函数
function* getQueryPairs() {
    yield ['user', 'abc'];
    yield ['query', 'first'];
    yield ['query', 'second'];
}
params = new URLSearchParams(getQueryPairs());
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'

// 每个键值对必须有两个元素
new URLSearchParams([
    ['user', 'abc', 'error']
]);
// 抛出 TypeError [ERR_INVALID_TUPLE]:
// 每一个键值对必须是迭代的[键,值]元组

 

posted @ 2018-01-31 11:01  Merrys  阅读(175)  评论(0编辑  收藏  举报