关于Promise

自从Saleforce进入Lightning时代,Promise这个在前端领域耳熟能详的名词,如当年鸦片战争的坚船利炮一般,强行闯入了Salesforce开发者的世界。

也不想谈太多的技术细节,因为Promise作为ES6的新特性,汉语的,英语的,日语的资料也是林林总总的非常详细。比如阮一峰老师的《ECMAScript 6 入门》中的此章节

其实Promise理解起来也很简单,就是按字面意思,我许诺,这事我答应你了去办。
事儿我解决了,就是resolve,没办成,就是reject。事儿办成以后咱看看下一步怎么办,就是then。如果中间出岔子了,后面的不管了,直接去找谁谁谁,就是catch。不管事儿办没办成,最后告诉我一声,就是finally。

Promise的出现可以说是为了解决Callback Hell,回调地狱。甚至还有一个网站来介绍回调地狱是什么。http://callbackhell.com/
在前端开发的上古时代,回调地狱是非常常见。在代码缩略图上
能明显的看到代码的形状是>型。
顾名思义,回调,就是我找你办事,我托你办事的时候同时也嘱咐你这件事儿办完了做什么。就是我把你处理完成时要调用的方法先传给你。
一般回调地狱发生的重灾区是多步骤的AJAX。因为AJAX调用是异步的。比如,先发AJAX请求获取一个token,然后发AJAX请求获取一个user的Id,然后再发一个AJAX请求去获得这个user的数据等等。每一步的下一步要在发出AJAX请求之前就作为回调设好。强行的将一堆异步的处理变成严格的按照先后顺序执行。

那么Promise的意义就在于,把>型的代码嵌套变成了流线型的new Promise(getToken()).then(value => getUser(value);).then(value => getRecord(value)).catch(e => console.error(e)); 在感官上更贴合“
将一堆异步的处理变成严格的按照先后顺序执行。 ”的目标。

如果说,Promise只是从>型变成了|型或者—型,好处还不够多。更重要的一点,与回调地狱写法相比,Promise提供了很好的异常处理机制。只要then链中任何一环抛出异常,都会直奔catch集中处理。

但是Promise也非完美,在极复杂情况下,比如根据上一步的返回值,要执行完全不同的业务流程,promise链就会略显无力。与此同时整条Promise链也会变的及其冗长,优点损失殆尽。还有异常处理的一些坑等有时间在讲。

所以在代码结构设计与业务流程上应尽量规避极其复杂与冗长的回调链。毕竟代码还是需要人来阅读。

Salesforce开发者也应该多去了解前端技术,看看这个世界已经发展到了什么样子,而不是固步自封在SFDC的小圈子里。

3+

Javascript如何生成Json

最近遇到个想复杂了的问题,就是如何用Javascript生成Json。
因为之前用的都是高级语言,已经封装好了数据结构或者类,直接赋值就好了。
之前想模拟前端向后台呼叫接口,需要POST方式传递JSON进来。然后就懵住了。

咦?我应该不用傻傻的拼接字符串吧。然后开始了脑洞。

脑洞第一版,模仿Salesforce制作List的方式

var dataArray = [];
var data = {};
data["id"] = "0010000000ABCD";
data["name"] = "Account";
dataArray.push(data);
var jsonString = JSON.stringify(dataArray);
var output = eval("(" + jsonString + ")");

感觉很怪。

脑洞第二版,用Javascript的类概念

var Account = new Object();
Account.Id = "0010000000ABCD";
Account.Name = "Account";
var output = JSON.stringify(Account);

感觉好多了,但感觉还是不够简单。毕竟Json是Javascirpt原生支持的啊。

然后查了半天,发现自己真的想复杂了

var output = {Id:"0010000000ABCD", Name:"Account"};

// Update 1
补充一下如何传两条数据

var output = [{Id:"0010000000ABCD", Name:"Account1"}, {Id:"0010000000ABCE", Name:"Account2"}];
0

Javascript的KeyCode

在前端开发中,经常使用onkeypress,onkeydown等event来做快捷键。
我之前就是打算使用“;”来做快捷键功能。
使用了如下代码

document.onkeydown = function(e) {
    e = e || window.event;
    var kcode = e.which || e.keyCode;
	if(String.fromCharCode(kcode) == ";") {
              // TODO Place your code here.
	}
};

结果。。。只有在Firefox好用,Chrome和IE都阵亡了。
我并没有做任何的浏览器判断,怎么会自动按浏览器区分功能呢?

原来,对于event的keycode,大部分的按键的keycode值在所有浏览器中都是一致的。
但是,有一小撮按键。。。。很不幸就有我选中的的“;”,在firefox和Chrome中是不一致的。
具体列表参照http://www.javascripter.net/faq/keycodes.htm

0

Javascript元素选择器的另一种选择

最近喜欢阅读代码,好的代码比好的文章还好看。

这次的起因是在看新的浏览器API叫做Push API,作用是作为服务器端可以向所有的订阅客户端推送消息。这个就厉害了,以前是没有方法进行主动推送的,都是在服务器端做轮询。不过还在起草阶段。其中有个Demo代码,我就下来看。

结果,发现了好东西querySelector()

以往我只会使用标准Js的getElementByXX与Jquery的$()。没想到新的Web API中居然自带了性能爆表的QuerySelector。语法与Jquery的选择器非常相似。

目前从官方文档看来,其他浏览器还好,IE系的话只支持IE8以上。下次决定试一下。

0