Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
async function sleep(ms: number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(), ms)
  })
}
async function randomDelay() {
  const randomTime = Math.round(Math.random() * 1000)
  return sleep(randomTime)
}
class ShipmentSearchIndex {
  async updateShipment(id: string, shipmentData: any) {
    const startTime = new Date()
    await randomDelay()
    const endTime = new Date()
    console.log(`update ${id}@${
        startTime.toISOString()
      } finished@${
        endTime.toISOString()
      }`
    )
    
    return {startTime, endTime}
  }
}
// Implementation needed
interface ShipmentUpdateListenerInterface {
  receiveUpdate(id: string, shipmentData: any) 
}
// Implementation 
class Shipment implements ShipmentUpdateListenerInterface {
  subject: any
  constructor(subject) {
    this.subject = subject;
  }
  
  async receiveUpdate(id: string, shipmentData: any) {
    console.log(`start ${id}`)
    const res = await new ShipmentSearchIndex().updateShipment(id, shipmentData);
    console.log(`Shipment ${id} startTime: ${res.startTime} endTime: ${res.endTime}`);    
  }
}
class Subject {
  observers: any
 
  
  constructor() {
    this.observers = []
  }
  
  subscribe(cb: any) {
    this.observers.push(cb);
  }
  onNext(v: any) {
    this.observers.forEach((cb) => {
      cb(v);
    });
  }
  done() {
    this.observers.shift();
  }
}
const source = new Subject()
const s = new Shipment(source)
s.receiveUpdate(1, 11)
s.receiveUpdate(1, 111)
s.receiveUpdate(2, 22)
s.receiveUpdate(2, 222)
s.receiveUpdate(2, 2222)
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
noelyahanpro
0viewers