文档章节

学习 kityminder (十五) save

刘军兴
 刘军兴
发布于 2015/12/15 11:06
字数 778
阅读 99
收藏 0
点赞 0
评论 0

本次学习 kityminder save 功能.

回顾 core/data.js:

// 注册一个(用于导入/导出的)协议.
exports.registerProtocol = function(name, protocol) {
  _protocols[name] = protocol;  // 放到一个集合中.
}

extend class Minder {
  exportJson(): // 导出当前脑图数据为 JSON 对象.
    // 方法是从根节点开始递归所有节点, 每个节点导出为一个 json 对象, 子节点组成一个数组.
  importNode(node, json): // 根据 json 数据转换成脑图节点.
  exportData(protocol_name, option): // 使用指定协议导出, 一会研究细节.
  importData(protocol_name, data, option):  // 使用指定协议导入.
}

协议的注册/获取比较简单. 由于 json 格式比较容易, 我们不如先研究 json 格式的 protocol.

找到 protocol/json.js 查看, 果然十分简单:

// 注册名为 'json' 的导入/导出协议.
data.registerProtocol('json', {
  fileDescription: 'KityMinder 格式', // 格式名.
  fileExtension: '.km',  // 文件后缀.
  ... dataType, mineType (应是 mime 拼写错?) 略...

  
  encode(json): // 编码函数, 对象->字符串. 使用内建 JSON 对象实现.
  decode(local): // 解码函数, 字符串->对象.
});

这里重点是提供了 encode(), decode() 两个函数, 分别对应导出, 导入. 如果未提供 decode(), 就表示不支持导入.

现在再细看 exportData(protocol-name, option) 方法, 步骤大致是:

Minder.prototype.exportData = function(protocol_name, option) {
  // 第一步先导出为 json 格式.
  var json = this.exportJson();

  // 如果指定了 protocol_name, 则检查该协议, 及是否支持导出.
  if (protocol_name) ... // 不支持则抛出异常.

  // 发布 'before-export' 事件.
  this.fire('beforeexport', ...);

  // 导出为指定格式数据.
  var encoded_data = protocol.encode(json, ...);
  return Promise.resolve(encoded_data); // 此调用暂时不明
}

 

如果忽略掉 Promise, 则其它都简单易解. 我们在 console 中试着使用此函数, 可看到结果:

 

这样, 如果我们要开发将数据存到 localStorage 或服务器上的功能, 只需使用 exportJson() 或 exportData()
将数据导出为 json 格式即可. 其它格式可选.

 

以前曾经忽略的 promise 不弄明白是不行啊, 总是跳出来挡路, 那今天就去查查它是做什么的.
打开 core/promise.js, 里面注释写着 Thenable - Embedded Minimum Strictly-Compliant Promises.
源码位于 http://github.com/rse/thenable, 让我们去找找有没有文档. 顺便找到一个不错的中文介绍:http://www.csdn.net/article/2014-05-28/2819979-JavaScript-Promise

看起来是为了解决多个回调(callback) 组成的金字塔(层层回调)问题.

认识一下 Promise/A+ 规范:

1. 一个 promise 可能有三种状态: 等待 (pending), 已完成 (fulfilled), 已拒绝(rejected)
2. 状态只能从 pending->fulfilled|rejected, 不能其它转换, 也不能逆向转换.
3. promise 必须实现 then 方法, 而且 then 必须返回一个 promise ...
4. then 方法接受两个参数: on_success, on_error: 成功时回调, 失败时回调.

使用示例:

function run() {
  getData('abc.json')
    .then(handle_json) // 返回一个 thenable 的对象
    .then(sleep(300))
    .then(show_next);
}

 

后面看到重点, 现今流行的各大 js 库, 几乎都不同程度的实现了 Promise, 只是暴露出来的大都是 Deferred 对象.
原来 Promise 是 Deferred 换了个名字么?

优点: Promise 用法很简单, 组织的代码很清晰, 从此不用再受 callback 的折磨了.

看来有空要多看类库源码......

 

© 著作权归作者所有

共有 人打赏支持
刘军兴
粉丝 54
博文 184
码字总数 226359
作品 0
昌平
百度脑图解析:如何进行web复杂应用的渐进式开发

内容来源:2017 年 4 月 8 日,张博在“HTML5梦工场 & 微软开发者沙龙第05期—持续集成”进行《Web复杂应用的 「渐进式」开发》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方...

06/04
0
0
学习 kityminder 笔记(五)

接着学习 kityminder, 前面其实没看完 kity, 大致了解之后, 我们先看看 minder 部分, 两者结合起来学更好些. 下载 kityminder-core (按文档说只含核心部分), 从 git-hub, 建立起开发/构造环境...

刘军兴
2015/11/19
0
0
学习 kityminder 笔记(六)

接上篇, 接着学习 kityminder. == core/keyreceiver.js == extend class Minder { init-hook(): 构造时设置选项, 侦听 'paperrender' 事件, 以调用 _initKeyReceiver() _initKeyReceiver():......

刘军兴
2015/11/19
0
0
学习 kityminder 笔记(七)

接上篇继续学习. 本段都是 seajs require(module/*.js) 的, 看起来是按照字母顺序 a-z 排列的, 所以应没什么互相依赖性. 考虑到前面有很多细节都略过, 或不懂, 在学习过程中可能还要不断回顾...

刘军兴
2015/11/20
0
0
再学习 Kity 笔记(五) 初步

在过去两周左右, 一直在学习 kity, kityminder, nodejs, seajs 等一系列项目. 有些认识经过一段时间学习, 已经发生了 变化, 使得原有笔记过时. 兹为深入学习, 有必要回顾复习重新看一遍. Kit...

刘军兴
2015/12/04
68
0
KityMinder 1.2.0 发布,脑图工具

脑图工具 KityMinder 出新版本啦! 功能增加,体验提升:) 自从KityMinder1.x版本正式上线以来,得到了广大同学的热情关注。同学们为KityMinder提出了各种好的建议。我们整个小组受到了很大...

战毅
2014/07/10
8.2K
12
学习 kityminder & angular (十四) event 和 scope.$apply

回顾 event 机制 先回顾一下以前看的 core/event.js, 其提供了 minder 的事件机制 (event) 支持: // 表示一个脑图中发生的事件class MinderEvent {ctor(type, parms, canstop): 构造一个脑图...

刘军兴
2015/12/14
188
0
学习 kityminder & angular (十三)

今天继续学习 kityminder-editor 以及所用及的 angular. 已知在页面中使用 angular, 整个 editor 部分界面由 directive <kityminder-editor /> 产生, 于是我们 进一步进入到该 directive 里面...

刘军兴
2015/12/11
295
0
学习 AngularJS (三) module

再看 kityminder-editor 部分代码, 上来就是 angular module: angular.module('kityminderEditor', [ ]) 看不明白, 怎么办? 只能接着学习了! 查 angularjs 英文官网, 终于找到 module 的网页...

刘军兴
2015/12/08
89
0
《Pro ASP.NET MVC 3 Framework》学习笔记目录

《Pro ASP.NET MVC 3 Framework》简介: 作者: Adam Freeman 和 Steven Sanderson 出版社: Apress; New 平装: 820页 语种: 英语 ISBN: 1430234040 声明:笔记里面按我自己的理解翻译了大部分...

mszhangxuefei
2012/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
42分钟前
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
53分钟前
2
0
将博客搬至CSDN

AHUSKY
今天
1
0
Python web框架Django学习(1)

1.Django简介 (1)Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。 (2...

十年磨一剑3344
今天
0
0
Databook-数据之书

Databook-数据之书 用于数据分析的Jupyter Notebooks。 不需购买服务器,快速开始自己的数据分析过程。 源码:https://github.com/openthings/databook 作者:openthings,https://github.co...

openthings
今天
5
0
Python PIPEs

https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm

zungyiu
今天
1
0
gRPC学习笔记

gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

OSC_fly
今天
0
0
Docker Mac (三) Dockerfile 及命令

Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

___大侠
今天
0
0
Android Studio+NDK+Cmake 移植FFmpeg-4.0.2命令行工具

一、编译 参考大神的帖子,亲测一次编译成功:https://blog.csdn.net/bobcat_kay/article/details/80889398 鉴于以前查文档的经验,这里附上编写例子的时间:2018年7月22日 我用的是ubantu,...

她叫我小渝
今天
0
0
mysql创建数据库

登录MYSQL mysql -u root -p 脚本创建数据库WeChat,并制定默认的字符集是utf8mb4。 CREATE DATABASE Wechat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all......

niithub
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部