有的时候需要等待回调函数结束,或者用到回调函数的返回值。
可以使用Promise来实现这个目标。
问题
考虑一个包含回调函数的函数 timeout(fun)
function timeout (fun) {
setTimeout(fun.bind(this, 1), 1000)
}
调用函数如下
timeout(function (num) {
console.log(num)
})
console.log(2)
会输出
2
1
解决办法
可以把包含回调函数的函数调用放在Promise
中,之后的语句放在then
中。
new Promise((resolve, reject) => {
timeout(function (num) {
console.log(num)
resolve()
})
}).then(() => {
console.log(2)
})
会输出
1
2
使用async & awiat
可以结合es7
的新特性async
await
,或者利用yield
co
简化代码。
(async function main () {
await new Promise((resolve, reject) => {
timeout(function (num) {
console.log(num)
resolve()
})
})
console.log('after', 2)
})()