我希望验证我的假设:
正如我读到的那样,要创建异步调用,我最终必须最终调用javascript本机调用(如setTimeout()
|| XMLHttpRequest()
|| ...)以退出引擎主调度程序循环。
任何希望异步的第三方图书馆都会间接地做同样的事情。
这是正确的,还是有办法在没有js本机调用的情况下故意创建我自己的异步代码(例如,通过在我的代码上允许阻塞功能)?
答案 0 :(得分:1)
在JavaScript中,有几种方法可以编写可以异步运行的代码。通常使用的方法是:
但是在HTML5(及更高版本)中,还有许多其他方法异步工作。例如,新的异步文件上传,Web Workers和Promises。 (注意:并非每个浏览器都支持所有这些)
但你的问题含糊不清。你想做什么?如果它以UI为中心,您可能需要查看requestAnimationFrame
如果通过屏蔽,则表示您希望显示" loading" gif然后去做东西并在"之后改变它们的东西"已经完成,有很多方法可以解决这个问题,但是对于较新的浏览器,您可以使用Promises:http://www.html5rocks.com/en/tutorials/es6/promises/并检查超时函数中的某些值。
//The value to check
var isDone = false;
var asynchCheck = function(resolve, reject) {
if ( notStarted )
{
// do stuff (calls async function that eventually sets "isDone" = true)
}
if ( isDone === true )
{
if ( no errors ) resolve("Stuff worked!");
else reject(Error("It broke"));
}
//Check again
else setTimeout( asynchCheck, 50 );
}
//Start your function
var promise = new Promise(asynchCheck);
//Now set the success/fail functions
promise.then(function(result) {
console.log(result); // "Stuff worked!"
}, function(err) {
console.log(err); // Error: "It broke"
});