kylin

醉里论道,醒时折花。

kylin

关于js异步

同步Ajax

在任何情况下都不应该使用这种方式,因为它会锁定浏览器UI(按钮、菜单、滚动条等),并阻塞所有的用户交互。

error-first风格的超时报错处理

1
2
3
4
5
6
7
8
9
10
11
12
13
function timeoutify(fn,delay){
var intv = setTimeout( function(){
intv = null
fn(new Error("Timeout"))
},delay)
return function(){
if(intv){
clearTimeout(intv)
fn.apply(this,arguments)
}
}
}

使用方式 gist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function foo(err,data){
if(err)
console.log(err)
else
console.log(data)
}
function timeoutify(fn,delay){
var intv = setTimeout( function(){
// ----A段代码----
intv = null
fn(new Error("Timeout"))
// ----A段代码----
},delay)
return function(){
if(intv){
clearTimeout(intv)
fn.apply(this,arguments)
}
}
}
function bar(fn){
setTimeout(function(){
fn('no timeout')
},500)
}
bar(timeoutify(foo,100))
//Error: Timeout
// at <anonymous>:1:1
bar(timeoutify(foo,600))
//no timeout

timeoutify方法返回一个function 若在delay时间前调用,则会清空计时器,若delay时间先到则会先运行A段代码,讲intv变量设为null并抛出错误

Promise

1
2
3
4
5
6
7
8
function timeout(ms){
return new Promise((resolve,reject)=>{
setTimeout(resolve,ms,'done')//IE9以下不支持传递额外参数
})
}
timeout(100).then((value)=>{
console.log(value)
})