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]: // 每一個鍵值對必須是迭代的[鍵,值]元組
?