一个面向 Angular2 以及 ionic2 开发者的 SDK
无法统计到具体有多少开发者会使用 Angular2 或者 ionic2 作为开发框架去进行实际的开发,诸如我个人使用的过程中被 zone.js 坑了不止一次:Angular2 View Not Changing After Data Is Updated,在 Promise 中经常遇到 angular2 不刷新页面的情况,我也局限于自己的前端能力,一怒之下我粗略地研究了下 angular2 的文档,发现它通篇都是在选择 RxJS 作为自己的异步解决方案,加上 LeanCloud 官方的 JS SDK 也不可能快速的切换到并不是所有 js 和 node 工程师都能接受的 rx 模式下,因此我花了 3 个月的时间,使用 TypeScript 重写了一遍 sdk,并且重命名了一些原来的 sdk 对于用户来说容易混淆的几个接口,这个 sdk 地址如下:LeanCloud TypeScript SDK
安装
npm install leancloud-typescript-rx-sdk --save
API Doc
LeanCloud TypeScript SDK API Doc
示例
存储一个对象:
let todo: RxAVObject = new RxAVObject('RxTodo');
todo.set('title', '开会');
todo.set('time', '2016-12-03');
todo.set('reminder', new Date());
todo.save().subscribe(success => {
if (success) console.log(todo.objectId);
});
适用环境和框架
正如标题所言,推荐在 Angular2 和 ionic2 下使用。
ionic2 适配
熟悉 LeanCloud SDK 的同学都应该对本地缓存 AVUser.current() 不陌生,因此我在设计 ts sdk 的时候,特地重写了这部分逻辑,我将本地缓存的接口暴露出来了,换言之,你可以让 ts sdk 将 AVUser.current() 存储在任何你可控的本地缓存里面,比如 ionic2 里面常用的本地缓存是:
import { Storage } from '@ionic/storage';
在 ts sdk 中定义了一个接口:
export interface IStorage {
add(key: string, value: any): Promise<any>;
remove(key: string): Promise<boolean>;
get(key: string): Promise<string>;
}
而开发者只要编写如下代码,实现这个接口并且在初始化 SDK 的传入即可:
import 'rxjs/add/operator/map';
import { IStorage } from 'leancloud-typescript-rx-sdk';
import { Storage } from '@ionic/storage';
export class IonicStorageProvider implements IStorage {
public storage: Storage;
constructor() {
this.storage = new Storage();
}
add(key: string, value: any): Promise<any> {
return this.storage.set(key, value);
}
remove(key: string): Promise<boolean> {
return this.storage.remove(key);
}
get(key: string): Promise<string> {
return this.storage.get(key);
}
}
初始化代码如下:
RxAVClient.init({
appId: 'your app id',
appKey: 'your app key',
plugins: {
storage: new IonicStorageProvider()// 指定本地缓存的插件
}
});
与官方 JS SDK 最大的区别可能就是要从 Promise 切换到 RxJS
关于这一点,我在 ts sdk 的 readme 上也做了解释:
为什么异步模型选择了 RxJavaScript 而不是亲儿子 Promise?- Why RxJS?
因为 RxJS 可以很好解决异步和事件组合的问题。大多数 BaaS 或者 PaaS 的使用者都是倾向于服务端是一个所见即所用的东西(正如 LeanCloud 这些年以来一直致力于实现的目标一样),
因此大多数用户都是客户端编程经验丰富,而经验丰富的客户端工程师对于异步和事件都不会陌生,而在 Rx 的编程理念中,致力于在这两者事件找到一种结合:
异步: await Task = Observable.subscribe
事件: event.onEmit = Observable.subscribe
也就是不管是主动和被动的行为都视为我作为一个客户端订阅了这两种行为的结果,这就是两者的共同点。
对于习惯了 Rx 的开发模之后,对客户端工程师来说很容易「深陷其中」。
最后
希望更广泛的用户能够使用更高效率的开发框架来减少开发的周期,这一点就是 LeanCloud 能够继续为大家服务的理由。