# สถานะจักรยานแบบเรียลไทม์: วิธีแสดงในแอปพลิเคชัน?

> แสดงสถานะจักรยานด้วย API ROOTE: เวลาอัปเดต, ความสดใหม่, ค่าที่ไม่ทราบ, การรีเฟรช และข้อมูลหมดอายุในแอปของคุณ

Source: https://www.roote.ai/th/guides/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%81%E0%B8%AA%E0%B8%94%E0%B8%87%E0%B8%AA%E0%B8%96%E0%B8%B2%E0%B8%99%E0%B8%B0%E0%B8%88%E0%B8%B1%E0%B8%81%E0%B8%A3%E0%B8%A2%E0%B8%B2%E0%B8%99%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%A5%E0%B9%84%E0%B8%97%E0%B8%A1%E0%B9%8C%E0%B9%83%E0%B8%99%E0%B9%81%E0%B8%AD%E0%B8%9B%E0%B8%9E%E0%B8%A5%E0%B8%B4%E0%B9%80%E0%B8%84%E0%B8%8A%E0%B8%B1%E0%B8%99/
Language: th
Author: ROOTE

เพื่อแสดงสถานะจักรยานแบบเรียลไทม์ในแอป ให้เชื่อมโยงจำนวนที่ได้กับความสดใหม่และความเป็นไปได้ในการยืมรถ ข้อมูลที่สังเกตอธิบายสิ่งที่แหล่งข้อมูลรู้ในช่วงเวลาหนึ่ง ๆ; ไม่ได้รับประกันว่าจะมีจักรยานอยู่ ณ เวลาที่ผู้ใช้ไปถึง

สัญญาการเคลื่อนที่ ROOTE แยกความแตกต่างระหว่างสถานี ยานพาหนะแต่ละคัน และสถานะของพวกมัน อินเทอร์เฟซต้องแสดงความแตกต่างเหล่านี้โดยไม่สับสนระหว่างค่าที่ไม่ทราบ สถานีว่าง และแหล่งข้อมูลที่ไม่พร้อมใช้งานชั่วคราว

## แยกความแตกต่างระหว่างสถานีกับยานพาหนะแต่ละคัน

สถานีสามารถแสดงตัวนับจำนวนจักรยานและที่จอดคืนจักรยานได้ ยานพาหนะแต่ละคันมีสถานะความพร้อมใช้งานและข้อมูลอื่น ๆ ที่เป็นไปได้ หลีกเลี่ยงการนับสถานีเป็นจักรยาน หรือการบวกตัวนับที่แทนสต็อกเดียวกันซ้ำกัน

ใน DTO การเคลื่อนที่ ROOTE, availability.bikes และ availability.docks อาจเป็นค่าที่ไม่ทราบ ช่องข้อมูลพลังงานหรือแบตเตอรี่ควรแสดงเฉพาะเมื่อมีอยู่และตีความตามสัญญา

[สัญญา OpenAPI ROOTE](https://api.roote.ai/openapi.json)

## อ่านความสดใหม่และเวลาอัปเดต

| ช่องข้อมูล | การตีความ |
| --- | --- |
| freshness.state | สถานะที่ประกาศ: fresh (สด), stale (ล้าสมัย), unknown (ไม่ทราบ) หรือ static (คงที่) |
| freshness.source_updated_at | วันที่แหล่งข้อมูลอัปเดต ถ้าทราบ |
| freshness.received_at | วันที่รับข้อมูลตามสัญญา |
| freshness.expires_at | วันหมดอายุของความถูกต้อง ถ้าทราบ |
| availability.bikes | จำนวนที่ทราบหรือค่าที่ไม่ทราบ |
| pickup.enabled และ pickup.state | ข้อมูลเกี่ยวกับการยืมจักรยานจากสถานี |

เวลาที่คุณเรียกดูข้อมูลไม่ใช่เวลาที่ข้อมูลถูกสังเกตโดยอัตโนมัติ ผลลัพธ์ที่รับเวลา 10 โมงเช้าอาจมีแหล่งข้อมูลที่อัปเดตเวลา 9:45 อย่าแสดงข้อความว่า 'อัปเดตเมื่อสักครู่นี้' เพียงเพราะเวลาที่รับข้อมูลของอินเทอร์เฟซคุณ

## เตรียมสถานะการแสดงที่แยกจากกัน

| ข้อมูลที่ได้รับ | การแสดงผลที่ควรวางแผน |
| --- | --- |
| จำนวนที่ทราบและข้อมูลสดใหม่ | จำนวนที่สังเกตและบอกเวลาของข้อมูล |
| จำนวนเท่ากับศูนย์ | ไม่มีจักรยานสังเกตเห็น พร้อมบริบทเวลา |
| จำนวน null | สถานะไม่ทราบ |
| สถานะ stale หรืเลยวันหมดอายุ | ข้อมูลเก่า; แนะนำให้รีเฟรช |
| pickup.enabled=false | ไม่สามารถยืมจักรยานได้แม้ตัวนับจะเป็นบวก |
| ข้อผิดพลาดในการค้นหา | สถานะไม้พร้อมใช้งานชั่วคราว โดยไม่แปลงเป็นศูนย์ |

อย่าจัดสถานะ unknown หรือ static เป็นข้อมูลสดใหม่ ข้อมูลสถานีอาจคงที่แม้ว่าตัวนับเปลี่ยนแปลงเร็ว ให้เก็บคำเตือนและข้อมูลที่จำเป็นตามการตอบสนอง

## ตัวอย่างการทำให้ข้อมูลเป็นมาตรฐานก่อนแสดงผล

ฟังก์ชันต่อไปนี้สร้างสถานะการแสดงจากสถานีที่ผ่านการตรวจสอบตามโครงสร้าง ROOTE แล้ว ไม่ใช่ตัวตรวจสอบความถูกต้องของการตอบสนองอย่างสมบูรณ์ ป้ายข้อความที่แสดงควรมาจากคีย์แปลภาษาในอินเทอร์เฟซของคุณ

```
function availabilityView(station, now = Date.now()) {
  const freshness = station.freshness;
  const expiresAt = freshness.expires_at
    ? Date.parse(freshness.expires_at) : null;
  const expired = expiresAt !== null &&
    Number.isFinite(expiresAt) && expiresAt <= now;
  if (station.pickup.enabled === false ||
      station.pickup.state === 'unavailable_now') {
    return { state: 'pickup_unavailable', count: null };
  }
  if (expired || freshness.state === 'stale') {
    return { state: 'stale', count: null };
  }
  const count = station.availability.bikes;
  if (freshness.state !== 'fresh' || count === null ||
      !Number.isFinite(count) || count < 0) {
    return { state: 'unknown', count: null };
  }
  return {
    state: count === 0 ? 'empty' : 'observed', count,
    sourceUpdatedAt: freshness.source_updated_at,
    receivedAt: freshness.received_at,
    pickupState: station.pickup.state
  };
}
```

แม้จะมีสถานะ observed แต่ไม่ควรเปลี่ยน pickupState=unknown เป็นการยืนยันการยืม ตัวนับเป็นข้อมูลที่สังเกต แสดงบริบทการยืมหากผลิตภัณฑ์ของคุณช่วยผู้ใช้เลือกสถานี

## รีเฟรชโดยไม่เพิ่มจำนวนการเรียกซ้ำโดยไม่จำเป็น

ปรับการรีเฟรชให้เข้ากับวันหมดอายุที่ประกาศ เงื่อนไขของบริการ และพฤติกรรมผู้ใช้ รวมคำขอเดียวกัน หลีกเลี่ยงการเรียกในแบ็คกราวด์บนหน้าที่ไม่ใช้งาน และยกเลิกคำขอการค้นหาที่ถูกแทนที่

เวลาคั่นแคชภายในเครื่องไม่รับประกันความสดของแหล่งข้อมูล หลังเกิดข้อผิดพลาด คุณอาจเก็บข้อมูลการสังเกตครั้งล่าสุดที่มีวันที่ หากอินเทอร์เฟซแสดงอย่างชัดเจนว่าเป็นข้อมูลเก่า อย่าลบความแตกต่างนี้เมื่อการเรียกคืนสำเร็จครั้งแรกถ้าแหล่งยังล้าสมัย

## เข้าใจความสัมพันธ์กับ GBFS

GBFS บรรยายบริการแบ่งปันการเดินทางและสถานะที่เผยแพร่ การผสานตรงต้องตีความไฟล์ เวอร์ชัน และเวลาในฟีด ด้วย API มาตรฐานให้ใช้สัญญา API อย่าเพิ่มช่องของ GBFS ที่อาจไม่มีอยู่ในคำตอบ

[เลือกใช้ระหว่าง GTFS, GTFS Realtime และ GBFS](https://www.roote.ai/th/guides/gtfs-gtfs-rt-et-gbfs-%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B9%81%E0%B8%95%E0%B8%81%E0%B8%95%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3/)

## ทดสอบสถานการณ์ที่อาจทำให้ผู้อ่านสับสน

ทดสอบศูนย์จริง ค่าที่ไม่ทราบ วันหมดอายุ ปิดการใช้งานการยืม และข้อผิดพลาดหลังผลลัพธ์ที่ถูกต้อง ตรวจสอบโซนเวลาการแสดงด้วย ตัวนับบวกไม่ควรแสดงข้อความ 'จักรยานจองแล้ว' และสถานะไม่พร้อมใช้งานไม่ควรแสดงศูนย์ปลอม

[จัดการคำตอบว่างและข้อผิดพลาด](https://www.roote.ai/th/guides/%E0%B8%9C%E0%B8%A5%E0%B8%A5%E0%B8%9A-api-%E0%B8%AB%E0%B8%A3%E0%B8%B7%E0%B8%AD-%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%9C%E0%B8%B4%E0%B8%94%E0%B8%9E%E0%B8%A5%E0%B8%B2%E0%B8%94-%E0%B9%81%E0%B8%A2%E0%B8%81%E0%B9%81%E0%B8%A2%E0%B8%B0%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B9%84%E0%B8%A3/)

[ใช้กฎเหล่านี้กับผู้ช่วย AI](https://www.roote.ai/th/guides/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%9C%E0%B8%B9%E0%B9%89%E0%B8%8A%E0%B9%88%E0%B8%A7%E0%B8%A2%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%94%E0%B8%B4%E0%B8%99%E0%B8%97%E0%B8%B2%E0%B8%87%E0%B8%A3%E0%B8%AD%E0%B8%9A%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%AD%E0%B8%A2%E0%B8%B9%E0%B9%88/)

[คู่มือผู้ใช้สำหรับการหาจักรยาน](https://www.roote.ai/th/guides/chyom-htyun-hnaai-xarohl-sb-saay-per-deu-soi/)

## คำถามที่พบบ่อย

### จำนวนบวกยืนยันได้ว่ามีจักรยานเมื่อฉันไปถึงไหม?

ไม่ใช่ มันแสดงข้อมูลสังเกตที่อาจเปลี่ยนแปลงระหว่างการค้นหาและการมาถึงของคุณ

### สามารถแทน null ด้วยศูนย์ได้ไหม?

ไม่ได้ null หมายถึงค่าที่ไม่รู้จัก ศูนย์หมายถึงจำนวนที่ทราบและมีความหมายต่างกัน

### ควรรีเฟรชทุกไม่กี่วินาทีไหม?

ใช้ข้อมูลวันที่หมดอายุ ขอบเขตของบริการ และความต้องการของอินเทอร์เฟซของคุณ ความถี่ที่ไม่กำหนดไม่ได้รับประกันว่าแหล่งข้อมูลจะสดใหม่กว่า
