AngularJS - 使用承诺中声明的变量

AngularJS - use variable declared in a promise

我正在尝试在一个函数内调用服务,然后使用来自该服务的响应数据,使用 .then,但我无法return 从该函数

 var status;

 var getStatus = function(data,$scope){

            registrationService.registration(data,$scope)
            .then(function (response) {

                return status = response.status;

                console.log("Status1: " + status);
            });     

}


status = getStatus(data,$scope);
console.log("Status2: " + status);

当我将服务调用移到函数外时一切正常

        registrationService.registration(data,$scope)
        .then(function (response) {

            status = response.status;

            console.log("Status1: " + status);
        }); 

但在这种情况下,我无法访问回调外部的 status 变量,我需要重新使用它来检查状态。

两件事。一、作业returnundefined.

所以,

return status = response.status;

return未定义。

二、一个return语句会停止一个函数块的执行。

下面的调用不是 console.logging,因为 return 阻止它到达 console.log。

registrationService.registration(data,$scope)
            .then(function (response) {

                return status = response.status;

                console.log("Status1: " + status);
            });   

这个调用是(你说的是工作,我假设这意味着你得到 console.log)是工作不是因为你把它从函数中拉出来,而是因为你删除了 return 语句。

registrationService.registration(data,$scope)
        .then(function (response) {

            status = response.status;

            console.log("Status1: " + status);
        }); 

更详细的更新:

getStatus return没什么所以它 return 未定义。这意味着状态在您的最终控制台日志之前被设置为未定义。

status = getStatus(data,$scope);

如果 registrationService.registration(data,$scope) 是异步的,那么您将不得不等到它在 console.logging 之前解决。当前,您 console.log 在执行 getStatus

后立即同步

更新 2

var status;

 var getStatus = function(data,$scope){

    return registrationService.registration(data,$scope)
            .then(function (response) {

                status = response.status;

                console.log("Status1: " + status);
            });     

}


getStatus(data,$scope)
    .then(function () {
        console.log("Status2: " + status);
    })

更新 3

对于下面评论中的后续问题,你真的应该像这样重构它:

function getStatus (data,$scope){

    return registrationService.registration(data,$scope)
            .then(function (response) {

                if (response.status === "pending") {
                    return getStatus(data, $scope)
                } else if (response.status === "accepted") {
                    // return something else
                } else {
                    // return something else 
                }
                console.log("Status1: " + status);
            });     

}
getStatus(data, $scope)
    .then(function (data) {
        // do whatever you want
    });