nextTick
export let isUsingMicroTask = false
const callback = []
let pending = false
function flushCallbacks(){
pending = false
const copies = callback.slice(0)
callback.length = 0
for(let i = 0;i < copies.length; i ++){
copies[i]()
}
}
let timeFunc
if(typeof Promise !== 'undefined' && isNative(Promise)){
const p = Promise.resolve()
timeFunc = () => {
p.then(flushCallbacks)
if(isIOS) setTimeout(noop)
}
isUseingMicroTask = true
}else if(!isIE && typeof MutationObserver !== 'undefined' && (isNative(MutationObserver) || MutationObserver.toString() === '[object MutationObserverConstructor]')){
let counter = 1
const observer = new MutationObserver(flushCallbacks)
const textNode = document.createTextNode(String(counter))
observer.observe(textNode,{
characterData: true
})
timeFunc = () => {
counter = (counter + 1)%2
textNode.data = String(counter)
}
isUseringMicroTask = true
}else if(typeof setImmediate !== 'undefined' && isNative(setImmediate)){
timeFunc = () => {
setImmediate(flushCallbacks)
}
}else {
timeFunc = () => {
setTimeout(flushCallbacks,0)
}
}
export function nextTick(cb,ctx){
let _resolve
callbacks.push(() => {
if(cb){
try{
cb.call(ctx)
}catch(e){
handleError(e,ctx,'nextTick')
}
}else if(_resolve){
_resolve(ctx)
}
})
if(!pending){
pending = true
timeFunc()
}
if(!cb && typeof Promise !== 'undefined'){
return new Promise(resolve => {
_resolve = resolve
})
}
}