Why couldn't popular JavaScript runtimes handle synchronous-looking asynchronous script?

前端 未结 4 627
鱼传尺愫
鱼传尺愫 2020-11-28 15:39

As cowboy says down in the comments here, we all want to \"write [non-blocking JavaScript] asynchronous code in a style similar to this:

 try 
 {
    var foo         


        
4条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-28 15:50

    Why not? No reason, it just hadn't been done.

    And here in 2017, it has been done in ES2017: async functions can use await to wait, non-blocking, for the result of a promise. You can write your code like this if getSomething returns a promise (note the await) and if this is inside an async function:

    try 
    {
        var foo = await getSomething();
        var bar = doSomething(foo);  
        console.log(bar); 
    } 
    catch (error) 
    {
        console.error(error);
    }
    

    (I've assumed there that you only intended getSomething to be asynchronous, but they both could be.)

    Live Example (requires up-to-date browser like recent Chrome):

    function getSomething() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                if (Math.random() < 0.5) {
                    reject(new Error("failed"));
                } else {
                    resolve(Math.floor(Math.random() * 100));
                }
            }, 200);
        });
    }
    function doSomething(x) {
        return x * 2;
    }
    (async () => {
        try 
        {
            var foo = await getSomething();
            console.log("foo:", foo);
            var bar = doSomething(foo);  
            console.log("bar:", bar); 
        } 
        catch (error) 
        {
            console.error(error);
        }
    })();
    The first promise fails half the time, so click Run repeatedly to see both failure and success.

    You've tagged your question with NodeJS. If you wrap the Node API in promises (for instance, with promisify), you can write nice straight-forward synchronous-looking code that runs asynchronously.

提交回复
热议问题