上篇文章我們閱讀了weex的類的構造過程。
這節我們將要查看Weex的定時器。在js中我們知道定時器有兩種,超時執行定時器和間隔執行定時器。但是在原生app中,只有超時執行定時器。可能weex為了兼容原生開發,只提供了一種定時器--超時執行定時器(setTimeout)。
由于webpack的打包,我們只能在調試模式下才能看到源碼或者在weex timer可以看到。
下面我貼出瀏覽器中的time.js的代碼
'use strict'
const timer = {
setTimeout: function (timeoutCallbackId, delay) {
/*sender = Sender {
instanceId: "http://127.0.0.1:8081/weex_tmp/h5_render/?hot-reload_controller&page=tech_list.js&loader=xhr",
weexInstance: Weex
}*/
const sender = this.sender
const timerId = setTimeout(function () {
sender.performCallback(timeoutCallbackId)
}, delay)
return timerId
},
clearTimeout: function (timerId) {
clearTimeout(timerId)
}
}
timer._meta = {
timer: [{
name: 'setTimeout',
args: ['function', 'number']
}, {
name: 'clearTimeout',
args: ['number']
}]
}
module.exports = timer
/** WEBPACK FOOTER **
** ./html5/browser/api/timer.js
**/
我們可以看到這里面定義了兩個方法,setTimeout和claerTimeout。
timer._meta = {
timer: [{
name: 'setTimeout',
args: ['function', 'number']
}, {
name: 'clearTimeout',
args: ['number']
}]
}
這句代碼中._meta是為weex注冊apimodule使用的。這在browser/api/index.js中可以得到驗證:
如果想使用setInterval,那么可以使用setTimeout模擬,代碼如下:
var intervalId=function(){
require('@weex-module/timer').setTimeout(function(){
_this.user.timeoutNum=_this.user.timeoutNum-1;
intervalId();
},1000);
};
intervalId();