What is the benefit of a 'promise' abstraction in CommonJS?

前端 未结 4 683
再見小時候
再見小時候 2020-12-09 18:59

I\'m reading this article and the section on the promise abstraction seems a little overly complicated to me. The following is given as an example:

requestS         


        
4条回答
  •  星月不相逢
    2020-12-09 19:43

    The second snippet is vulnerable to denial of service attack because example.com/foo can just return invalid json to crash the server. Even empty response is invalid JSON (though valid JS). It's like mysql_* examples with glaring SQL injection holes.

    And the promise code can be improved much as well. These are equal:

    requestSomeData("http://example.com/foo") // returns a promise for the response
        .then(function(response){ // ‘then’ is used to provide a promise handler
            // parse the body
            var data  = JSON.parse(response.body);
    
            // get the price
            var price = data.price;
    
            // print out the price
            print("The price is " + price);
        });
    

    And:

    requestSomeData("http://example.com/foo")
        .requestHandler(function(response){
            try {
                var data = JSON.parse(response.body);
            }
            catch(e) {
                return;
            }
    
            // get the price
            var price = data.price;
    
            // print out the price
            print("The price is " + price);
        });
    

    If we wanted to handle the error, then these would be equal:

    requestSomeData("http://example.com/foo") // returns a promise for the response
        .then(function(response){ // ‘then’ is used to provide a promise handler
            // parse the body
            var data  = JSON.parse(response.body);
    
            // get the price
            var price = data.price;
    
            // print out the price
            print("The price is " + price);
        }).catch(SyntaxError, function(e) {
            console.error(e);
        });
    

    and:

    requestSomeData("http://example.com/foo")
        .requestHandler(function(response){
            try {
                var data = JSON.parse(response.body);
            }
            catch(e) {
                //If the above had a typo like `respons.body`
                //then without this check the ReferenceError would be swallowed
                //so this check is kept to have as close equality as possible with
                //the promise code
                if(e instanceof SyntaxError) {
                    console.error(e);
                    return;
                }
                else {
                    throw e;
                }
            }
    
            // get the price
            var price = data.price;
    
            // print out the price
            print("The price is " + price);
        });
    

提交回复
热议问题