Javascript中的回调,承诺,异步等待 - 仍然令人困惑

时间:2018-01-21 10:50:24

标签: javascript angularjs asynchronous callback promise

我是Javascript的新手,我看到很多视频,但我仍然无法理解回调,承诺和异步等待的确切用法。在这里,我写了一些小代码,直到我的知识。

我的index.html:

<!DOCTYPE html>
<html lang="en" ng-app='myApp'>

<head>
    <meta charset="UTF-8">
    <title>Index</title>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js'></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
    <script src='script.js'></script>
</head>

<body ng-controller='myController'>

</body>

</html>

的script.js:

angular
    .module('myApp', [])
    .controller('myController', function($scope, $http) {


        // i think these are callbacks
        function callback(response) {
            console.log("Animal name:", response.data);
        }
        function callbackerr(response) {
            console.log("err:", response);
        }
        $http({
                method: 'GET',
                url: 'animalname.json'
            }).then(callback)
            .catch(callbackerr);



        // i think these are promises
        $http({
            method: 'GET',
            url: 'animalage.json'
        }).then(function(response) {
            console.log("Animal age: ", response.data);
        }).catch(function(error) {
            console.log(error);
        })

        // i think to write new code in async await
        // how to write my above code using async await?

    });

请修改并解释,如果我对回调的承诺,承诺是错误的。

帮助我!

2 个答案:

答案 0 :(得分:3)

回调只是一个函数,它作为参数传递给另一个函数然后在其中执行。承诺只是一种也接受回调的模式。要在javascript中使用新的async / await模式编写相同的东西,你可以写这样的东西。

请注意,控制器功能以async为前缀。

Async / await只会使代码看起来更具程序性。

angular
    .module('myApp', [])
    .controller('myController', async function($scope, $http) {

        const response = await $http({
            method: 'GET',
            url: 'animalage.json'
        })

        console.log("Animal age: ", response.data);
    });

答案 1 :(得分:2)

我可以理解你的困惑,当我们进行同步调用时使用Promises,即当你向服务器发送请求时,javascript不会停止执行以下代码。当以下代码使用来自服务器请求的响应数据时,这可能是问题,因为服务器请求可能尚未完成。这是通过承诺解决的。 Javascript的事件驱动方法为我们提供了两个事件,一个是承诺解决后(服务器响应数据),另一个是承诺被拒绝(服务器错误)。在.then块中,我们可以调用使用响应数据的回调函数。在.catch块中,我们可以调用回调函数,该函数通知用户有关错误或重试服务器请求。

因此我们可以调用.then.catch函数的任何函数都是promise,而我们在.then.catch块中编写的函数称为回调函数。