Javascript AngularJS:多个$http请求,然后承诺返回未定义的

Javascript AngularJS:多个$http请求,然后承诺返回未定义的,javascript,angularjs,json,http,promise,Javascript,Angularjs,Json,Http,Promise,在尝试使用AngularJS连续发出两个http请求后,我没有收到第二个http请求的响应 我有以下代码: createBucket: function (bucketKey, policyKey) { // get token from json file return $http({ url: tokenUrl }) .then(function

在尝试使用AngularJS连续发出两个http请求后,我没有收到第二个http请求的响应

我有以下代码:

        createBucket: function (bucketKey, policyKey) {

            // get token from json file
            return $http({
                url: tokenUrl
            })
            .then(function (response) {
                token = response.data;
                console.log('refreshing access token');
                console.log(token);
            })
            .then(function (response) {

                // use token to create new bucket
                $http({
                    method: 'POST',
                    headers: {
                        "Authorization": token.token_type + " " + token.access_token
                    },
                    url: "https://developer.api.autodesk.com/oss/v2/buckets",
                    data: {
                        "bucketKey": bucketKey,
                        "policyKey": policyKey
                    }

                });

            }).then(processResponse);
        },
首先,我执行一个http请求以获取json文件。然后使用这个json文件中的信息,我执行另一个http请求,我想返回这个请求的结果。在最终代码中:

    // Send the data part of the response
    function processResponse(response) {
        console.log('response:');
        console.log(response);
        return response.data;
    }

此处的响应未定义。。我不知道为什么…

你的每个
。然后,
需要返回一些东西:

    createBucket: function (bucketKey, policyKey) {

        // get token from json file
        return $http({
            url: tokenUrl
        })
        .then(function (response) {
            token = response.data;
            console.log('refreshing access token');
            console.log(token);
            return response;
        })
        .then(function (response) { // Response was already undefined here. The reason why token had something is because you surely have defined it in a parent javascript scope.

            // use token to create new bucket
            $http({
                method: 'POST',
                headers: {
                    "Authorization": token.token_type + " " + token.access_token
                },
                url: "https://developer.api.autodesk.com/oss/v2/buckets",
                data: {
                    "bucketKey": bucketKey,
                    "policyKey": policyKey
                }
            });
            return response;

        }).then(processResponse);
    },

链接承诺时,您需要从每个返回一个新的承诺。然后步骤将在后续的每个步骤中执行。

您有太多的
然后
s。。。当链接
然后
语句时,请确保每个语句都返回下一个语句的承诺。尝试:

createBucket: function (bucketKey, policyKey) {

    // get token from json file
    $http({
        url: tokenUrl
    })
    .then(function (response) {
        token = response.data;
        console.log('refreshing access token');
        console.log(token);
        return $http({
            method: 'POST',
            headers: {
                "Authorization": token.token_type + " " + token.access_token
            },
            url: "https://developer.api.autodesk.com/oss/v2/buckets",
            data: {
                "bucketKey": bucketKey,
                "policyKey": policyKey
            }
        });
    })
    .then(processResponse);
}

您需要返回链接的

createBucket: function (bucketKey, policyKey) {

    // get token from json file
    return $http({
        url: tokenUrl
    })
    .then(function (response) {
        var token = response.data;
        console.log('refreshing access token');
        console.log(token);
        //return token for chaining
        return token;
    })
    .then(function (token) {
        //save 2nd httpPromise for chaining
        var p1 = $http({
            method: 'POST',
            headers: {
                      "Authorization": token.token_type + " " + 
                      token.access_token
                      },
            url: "https://developer.api.autodesk.com/oss/v2/buckets",
            data: {
                "bucketKey": bucketKey,
                "policyKey": policyKey
            }
        //return httpPromise for chaining
        return p1;
        });

    }).then(processResponse);
},

最后,我选择这样做:

        createBucket: function (bucketKey, policyKey) {

            // get access token from json file
            return $http({
                url: tokenUrl
            })
            .then(function (response) {
                return response.data;
            })
            .then(function (token) {

                // use response.data / access token to create new bucket
                return $http({
                    method: 'POST',
                    headers: {
                        "Authorization": token.token_type + " " + token.access_token
                    },
                    url: "https://developer.api.autodesk.com/oss/v2/buckets",
                    data: {
                        "bucketKey": bucketKey,
                        "policyKey": policyKey
                    }

                })
                .then(successCallback, function errorCallback(response) {
                    displayError(response);
                });

            });
        },

第二个http请求现在也执行了,问题是我没有从第二个http请求得到结果。我可以看到我在控制台中执行了第二个http请求。但是processResponse方法从未执行或未定义。谢谢,但是processResponse方法仍然没有执行,即使第二个http请求是…您需要在链接到
processResponse
函数之前返回第二个承诺。