mithril-vndb/test-utils/callAsync.js
2016-08-03 07:21:15 -04:00

57 lines
1.5 KiB
JavaScript

"use strict"
/**
* This is modeled after Bluebird's scheduler. It solves for quite a few edge
* cases, and should help alleviate most of the flakiness issues. It also speeds
* up the suite a bit.
*/
module.exports = (function () {
// The scheduler for NodeJS/io.js is setImmediate for recent versions of
// node because of macrotask semantics (i.e. don't starve the event loop).
if (typeof process !== "undefined" &&
/^\[object process\]/i.test({}.toString.call(process))) {
var version = process.versions.node.split(".").map(Number)
var isRecent = version[0] === 0 && version[1] > 10 || version[0] > 0
return isRecent ? setImmediate : process.nextTick
}
if (typeof Promise === "function") {
var p = Promise.resolve()
return function (fn) {
p.then(fn)
}
}
if (typeof MutationObserver !== "undefined") {
// Using 2 mutation observers to batch multiple updates into one.
var div = document.createElement("div")
var opts = {attributes: true}
var toggleScheduled = false
var div2 = document.createElement("div")
var o2 = new MutationObserver(function() {
div.classList.toggle("foo")
toggleScheduled = false
})
o2.observe(div2, opts)
function scheduleToggle() {
if (toggleScheduled) return
toggleScheduled = true
div2.classList.toggle("foo")
}
return function (fn) {
var o = new MutationObserver(function() {
o.disconnect()
fn()
})
o.observe(div, opts)
scheduleToggle()
}
}
return typeof setImmediate === "function" ? setImmediate : setTimeout
})()