是否可以创建自己的异步Javascript代码

时间:2014-11-12 20:13:09

标签: javascript asynchronous cross-browser

我希望验证我的假设:

正如我读到的那样,要创建异步调用,我最终必须最终调用javascript本机调用(如setTimeout() || XMLHttpRequest() || ...)以退出引擎主调度程序循环。

任何希望异步的第三方图书馆都会间接地做同样的事情。

这是正确的,还是有办法在没有js本机调用的情况下故意创建我自己的异步代码(例如,通过在我的代码上允许阻塞功能)?

1 个答案:

答案 0 :(得分:1)

在JavaScript中,有几种方法可以编写可以异步运行的代码。通常使用的方法是:

  1. 的setTimeout
  2. 的setInterval
  3. 的XMLHttpRequest
  4. 但是在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"
    });