Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
阿里旅行去啊H5首页总结&Promise
Search
ningzbruc
August 06, 2015
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
阿里旅行去啊H5首页总结&Promise
阿里旅行去啊H5首页总结&Promise
ningzbruc
August 06, 2015
More Decks by ningzbruc
See All by ningzbruc
如何写出一个优秀的开源库
ningzbruc
0
66
去啊无线前端的一天
ningzbruc
1
180
React & Component
ningzbruc
0
45
KISSY.Base - all about that Base
ningzbruc
0
130
Hammer.js
ningzbruc
1
340
淘宝旅行门票iPad版开发
ningzbruc
0
140
Travel on KISSY mini
ningzbruc
0
200
Events
ningzbruc
2
130
Why YUI3
ningzbruc
0
190
Other Decks in Programming
See All in Programming
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
130
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
330
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
250
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
7
4.3k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
510
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
120
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.1k
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
Featured
See All Featured
Prompt Engineering for Job Search
mfonobong
0
340
Mobile First: as difficult as doing things right
swwweet
225
10k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Thoughts on Productivity
jonyablonski
76
5.2k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Done Done
chrislema
186
16k
My Coaching Mixtape
mlcsv
0
150
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
去啊H5首页总结 D[夯䔺
module KISSY.add(function(S, require, exports, module) { 'use strict'; var Q
= require('q'), IO = require('io'), UA = require('ua'), MTop = require('mtop'); module.exports = {…}; });
when not use base?
when not use base? KISSY.add(function(S, UA, Base, Util, City, Data,
View) { 'use strict'; return Base.extend([City, Data, View], {…}, { ATTRS: {…} }); }, { requires: [ 'ua', 'base', './util', './city', './data', './view' ] });
when not use base? KISSY.add(function(S, require, exports, module) { 'use
strict'; var UA = require('ua'), Util = require('./util'), City = require('./city'), Data = require('./data'), View = require('./view'); module.exports = S.merge(City, Data, View, {…}); });
when not use base? S.merge(S.Event.Target, City, Data, View, {…});
when not use base? Base is good but we should
not abuse it…
sketch 解放生产力!!!
sass ✓ rem - 字体自适应 ✓ scale - 比例缩放 ✓
1px - 高清屏细边
(function (root) { var docEl = document.documentElement; function changeRem ()
{ root.rem = docEl.getBoundingClientRect().width / 20; docEl.style.fontSize = root.rem + 'px'; } changeRem(); //... })(window, undefined); sass - rem
@function rem($values){ $list: (); @each $value in $values { $list:
#{$value/32}rem; } @return $list(); } h2 { font-size: rem(32); padding:0 rem(20); height:rem(80); line-height:rem(80); color:rgba(32,35,37,0.8); } sass - rem
sass - 1px .r1b:after { position: absolute; content: ""; top:
0; left: 0; -webkit-box-sizing: border-box; box-sizing: border-box; width: 100%; height: 100%; border: 1px solid rgba(32,35,37,0.15); } @media (-webkit-device-pixel-ratio: 2) { .r1b:after { width: 200%; height: 200%; -webkit-transform: scale(.5); transform: scale(.5); } }
sass - scale .banner { @include scaleOutter(324); } .banner-scroller {
@include scaleInner; overflow:hidden; }
@mixin scaleOutter($height, $width:640) { position:relative; padding-bottom:percentage($height / $width); height:0; overflow:visible;
} @mixin scaleInner($width:100%,$height:100%,$top:0,$left:0,$right:auto,$bottom:auto) { position:absolute; width:$width; height:$height; top:$top; left:$left; right:$right; bottom:$bottom; } sass - scale
image optimize <img data-src="${item.image|image_optim,'640x640','q75'}" class="lazyload fade" /> // 图⽚片优化 Juicer.register('image_optim',
function(url, size, q) { var suffix = '', regx = /_(\d+x\d+)?(q\d+)?\.(jpg|jpeg|png|gif)$/i, match, format; // 获取URL上的参数 if ((match = url.match(regx))) { url = url.replace(regx, ''); size = size || match[0]; q = q || match[1]; format = match[2]; } size && (suffix += size); // 尺⼨寸 q && (suffix += q); // 质量 suffix && (suffix = '_' + suffix + '.jpg'); // 后缀格式 self.isSupportWebp && (suffix += '_.webp'); // ⽀支持webp url && (url += suffix); return url; });
image optimize - webp http://gtms01.alicdn.com/tps/i1/TB1uBH9IFXXXXc.XFXXXETMFFXX-1080-547.jpeg_640x640q75.jpg_.webp use webp: 24.9kb -> 14.6kb
http://gtms01.alicdn.com/tps/i1/TB1uBH9IFXXXXc.XFXXXETMFFXX-1080-547.jpeg_640x640q75.jpg
loading render default page render getCity getData getCity getData flow
optimize 1 2
getCity getData default page / cache page getCity getData default
page / cache page diffHTML 3 4 flow optimize render render
diff html diffHTML: function(tpls, cache) { //... return { add:
add, del: del, update: update, resort: resort, rerender: add.concat(update), modify: add.length || del.length || update.length }; }, renderHTML: function(data) { // diff⼀一下各模块是否有修改 diff = this.diffHTML(tpls, ctpls); console.log(diff); // 如果有修改(增删改) if (diff.modify) { // 先销毁原先的模块逻辑 rerender = diff.rerender; this.destroyMods(rerender); // 先删除没有的模块 diff.del.forEach(function(t) { node = S.one('.' + t.id); node && node.remove(true); }); // 增加新增的模块 diff.add.forEach(function(t) { container.append(t.html); }); // 更新原有的模块 diff.update.forEach(function(t) { // !!!去抢购不需要重新替换HTML if (t.id !== 'trip_home_sale') { node = S.one('.' + t.id); node && node.replaceWith(t.html); } }); } // 如果顺序发⽣生变化 if (diff.resort) { tpls.forEach(function(t) { node = S.one('.' + t.id); node && container.append(node); }); } return rerender; },
Promise “A promise represents the eventual result of an asynchronous
operation. The primary way of interacting with a promise is through its then method, which registers callbacks to receive either a promise’s eventual value or the reason why the promise cannot be fulfilled.” - Promises/A+ https://promisesaplus.com/
Promise getCity getData default page / cache page diffHTML render
Promise getCity getData default page / cache page diffHTML render
Promise
Promise // sync this.getCity() .getData() .render();
Promise // sync this.getCity() .getData() .render(); // async - callbacks
this.getCity(function(city) { this.getData(city, function(data) { this.render(data); }); });
Promise // sync this.getCity() .getData() .render(); // async - callbacks
this.getCity(function(city) { this.getData(city, function(data) { this.render(data); }); }); 回调过度嵌套
Promise // sync this.getCity() .getData() .render(); // async - callbacks
this.getCity(function(city) { this.getData(city, function(data) { this.render(data); }); }); // async - promise this.getCity() .then(this.getData) .then(this.render); 回调过度嵌套
Promise
Promise // async - callbacks getData: function(city, callback) { if
(yes) { callback(null, data); } else { callback(reason, null); } }
Promise // async - callbacks getData: function(city, callback) { if
(yes) { callback(null, data); } else { callback(reason, null); } } 混淆参数与返回值
Promise // async - callbacks getData: function(city, callback) { if
(yes) { callback(null, data); } else { callback(reason, null); } } // async - promise getData: function(city) { return new Promise(function(resolve, reject) { if (yes) { resolve(data); } else { reject(reason); } }); } 混淆参数与返回值
Promise
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } });
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } }); 处理错误麻烦
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } }); // async - promise this.getData(city) .then(this.render, this.handleError); 处理错误麻烦
Promise // async - callbacks this.getData(city, function(err, data) { if
(err) { this.handleError(err); } else { this.render(data); } }); // async - promise this.getData(city) .then(this.render, this.handleError); 处理错误麻烦 // async - promise - catch this.getData(city) .then(this.render) .catch(this.handleError);
Promise - status pending fullfilled rejected resolve reject single way
Promise - status
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status 多种状态可能执行多次
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status // async - promise getCity: function(callback) { return new Promise(function(resolve, reject) { resolve(urlCity); resolve(cacheCity); this.getLocateCity.then(resolve); setTimeout(function() { resolve(defaultCity); }, 8000); }); } 多种状态可能执行多次
// async - callbacks getCity: function(callback) { var timer; if
(urlCity) { callback(urlCity); } else if (cacheCity) { callback(cacheCity); } else { this.getLocateCity(function(locateCity) { clearTimeout(timer); callback(locateCity); }); timer = setTimeout(function() { callback(defaultCity); }, 8000); } } Promise - status // async - promise getCity: function(callback) { return new Promise(function(resolve, reject) { resolve(urlCity); resolve(cacheCity); this.getLocateCity.then(resolve); setTimeout(function() { resolve(defaultCity); }, 8000); }); } 多种状态可能执行多次 多种状态只执行一次
Promise - all
Promise - all // async - callbacks getData: function(city, callback)
{ var count = 0, datas = []; function checkDone(data) { datas.push(data); if (++count == 2) { callback(datas); } } this.getLayoutData(city, function(data) { checkDone(data); }); this.getOnsaleData(function(data) { checkDone(data); }); }
Promise - all // async - callbacks getData: function(city, callback)
{ var count = 0, datas = []; function checkDone(data) { datas.push(data); if (++count == 2) { callback(datas); } } this.getLayoutData(city, function(data) { checkDone(data); }); this.getOnsaleData(function(data) { checkDone(data); }); } 并行异步操作麻烦,并且无法保证返回值顺序
Promise - all // async - callbacks getData: function(city, callback)
{ var count = 0, datas = []; function checkDone(data) { datas.push(data); if (++count == 2) { callback(datas); } } this.getLayoutData(city, function(data) { checkDone(data); }); this.getOnsaleData(function(data) { checkDone(data); }); } // async - promise getData: function(city) { return Promise.all([ this.getLayoutData(city), this.getOnsaleData() ]); } 并行异步操作麻烦,并且无法保证返回值顺序
Promise - api • Promise.all(promises) - 并行处理异步,全部结束时返回值 • Promise.race(promises) -
并行处理异步,第一个结束时返回值 • Promise.resolve(value) - 生成一个成功的 Promise 对象 • Promise.reject(reason) - 生成一个失败的 Promise 对象 • promise.then(onFullfilled, onRejected) - 处理回调 • promise.catch(onRejected) - 处理失败回调 Static Prototype
• caniuse • RSVP.js • Q.js • https://promisesaplus.com/ • http://www.html5rocks.com/en/tutorials/es6/promises/
• https://www.youtube.com/watch?v=qbKWsbJ76-s • https://www.youtube.com/watch?v=wc72cyYt8-c can I use Promise?
感想
感想 • “迷途知返”- 要及时跳出坑
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码 • 极致体验精益求精是我们永无止境的追求
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码 • 极致体验精益求精是我们永无止境的追求 • 把每一个项目都当做是一次超越自己的机会
感想 • “迷途知返”- 要及时跳出坑 • 写注释可以帮助重新梳理逻辑与优化代码 • 极致体验精益求精是我们永无止境的追求 • 把每一个项目都当做是一次超越自己的机会
• ES6 is Comming !!!
None
THE END.