Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Web 上实现 RPC 的设想

  基于 HTTP 的 API 终究是别扭的,RPC 才是 API 的最佳载体。但如果 WebSocket 没法使用的话,RPC 服务的搭建还是有点坑的。那么基于 HTTP 造一个 RPC 吧(可以使用 JSON-RPC)?虽然感觉会造出奇怪的东西,但比起栽在 RESTful 里,这个轮子还是值得一造的。
  其实有现成的 thrift with JavaScript 可以用的,今天尝试了下,感觉这东西对于写惯了 ES6 的我而言仿佛回到了上个年代。而且 thrift 好像完全不鸟 Web 这一套,只是为了跨语言提供 RPC 而存在的而已。
  其实我想要的东西是「后端封装的对象可以在前端使用」,比如下面这么一套用法 Demo 就是服务器和客户端在共享一个类。 // 服务器程序

class Foo {
  constructor(raw) {
    Object.assign(this, raw);
  }
  remove() {
    return database.query(`delete from foolist where id=${this.id}`);
  }
}

class FooList extends Array {
  constructor() {
    super();
  }
  static create() {
    return new Promise((resolve, reject) => {
      database.query('select * from foolist').then(rows => {
        var list = new FooList();
        rows.forEach(item => list.push(new Foo(item)));
        resolve(list);
      }, reject);
    });
  }
}
// 客户端

// 调用 create,这里会向服务器发一个请求
FooList.create().then(fooList => {
  // 遍历并输出到控制台
  fooList.forEach(foo => console.log(foo));
  // 删除掉某一项
  // fooList 中的每一项是一个 Foo 对象,所以可以调用其 remove 方法
  // 此处会发起一个网络请求,成功后手动删除本地数据
  fooList[3].remove().then(() => fooList.splice(3,1));
});
  核心思想就是 RPC 的那一套,实现一个跨平台的对象,当调用时通过网络。并且使用 JavaScript 的 Promise 等优秀特性让异步更自然地处理。
  当然,上面的 Demo 只是我随手写的,现在还没去封装这么一套东西,所以这个代码根本跑不起来。还没去封装是因为有些坑没踩平。比如上面 Demo 中出现的删除服务器端的数据并不会自动同步到本地之类的小坑姑且不论,HTTP 这个终极大坑才是最大的障碍。
  总之无论坑有多少,我还是觉得 API 这东西终究是得走 RPC 的,RESTful 只是这条路上的一块石头而已。
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^