Node.jsで実行してください。
// #@@range_begin(list1) const EventEmitter = require('events').EventEmitter; class Countdown extends EventEmitter { constructor(seconds, superstitious) { /* superstitious: 迷信深い */ super(); this.seconds = seconds; this.superstitious = !!superstitious; /* 「!!」は3章参照 */ } go() { /* メソッドgoの定義 */ const countdown = this; return new Promise(function(resolve, reject) { for(let i=countdown.seconds; i>=0; i--) { setTimeout(function() { if(countdown.superstitious && i===13) return reject(new Error(`${i}という数は不吉過ぎます`)); countdown.emit('tick', i); if(i===0) resolve(); }, (countdown.seconds-i)*1000); } }); } } // #@@range_end(list1) // #@@range_begin(list2) const c = new Countdown(15); c.on('tick', function(i) { if(i>0) console.log(i + '...'); }); c.go() .then(function() { console.log('GO!'); }) .catch(function(err) { console.error(err.message); }) // #@@range_end(list2)