Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs:控制器中的函数返回的变量为;“未定义”; angular.module('angularApp',['dialogs.main'])) .controller('TableController',函数(对话框,$http){ 函数getEmailAddress(){ var emailAddress=“empty”; $http({ //这里定义了http方法,该方法按预期工作 }).然后(功能成功(响应){ emailAddress=response.data; console.log(emailAddress+“:getEmailAddress success”);//从这个日志中,我可以看到我所期望的 return emailAddress;//但是,这不会返回可以在日志中看到的值。 //返回{ //emailAddress:emailAddress //};//这样也不行 },函数resendError(){ 返回“错误!”; }); }; this.resendConfirmationMail=函数(orderId){ //在这个函数中,将使用上面的函数。 }; });_Javascript_Angularjs - Fatal编程技术网

Javascript Angularjs:控制器中的函数返回的变量为;“未定义”; angular.module('angularApp',['dialogs.main'])) .controller('TableController',函数(对话框,$http){ 函数getEmailAddress(){ var emailAddress=“empty”; $http({ //这里定义了http方法,该方法按预期工作 }).然后(功能成功(响应){ emailAddress=response.data; console.log(emailAddress+“:getEmailAddress success”);//从这个日志中,我可以看到我所期望的 return emailAddress;//但是,这不会返回可以在日志中看到的值。 //返回{ //emailAddress:emailAddress //};//这样也不行 },函数resendError(){ 返回“错误!”; }); }; this.resendConfirmationMail=函数(orderId){ //在这个函数中,将使用上面的函数。 }; });

Javascript Angularjs:控制器中的函数返回的变量为;“未定义”; angular.module('angularApp',['dialogs.main'])) .controller('TableController',函数(对话框,$http){ 函数getEmailAddress(){ var emailAddress=“empty”; $http({ //这里定义了http方法,该方法按预期工作 }).然后(功能成功(响应){ emailAddress=response.data; console.log(emailAddress+“:getEmailAddress success”);//从这个日志中,我可以看到我所期望的 return emailAddress;//但是,这不会返回可以在日志中看到的值。 //返回{ //emailAddress:emailAddress //};//这样也不行 },函数resendError(){ 返回“错误!”; }); }; this.resendConfirmationMail=函数(orderId){ //在这个函数中,将使用上面的函数。 }; });,javascript,angularjs,Javascript,Angularjs,我要做的是创建/使用一个函数,该函数返回一个值,该值来自http函数 如上所述,有两个函数,其中一个函数应该返回一个名为emailAddress的变量,但返回的变量被描述为未定义的,甚至不是空的,作为其初始值 我可以从控制台.log中看到正确的返回值,但我不能只返回它 function test () { $http.get('url') .then(x => x.data); } var data = test(); 非常感谢您的建议。getEmailAddr

我要做的是创建/使用一个函数,该函数返回一个值,该值来自http函数

如上所述,有两个函数,其中一个函数应该返回一个名为
emailAddress
的变量,但返回的变量被描述为
未定义的
,甚至不是
空的
,作为其初始值

我可以从控制台.log中看到正确的返回值,但我不能只返回它

function test () {
    $http.get('url')
        .then(x => x.data);
}

var data = test();

非常感谢您的建议。

getEmailAddress
是一个异步函数(因为它使用的
$http
也是异步的)。您可以从
getEmailAddress
方法返回承诺,然后使用
获取电子邮件地址:

<script type="text/javascript">
angular.module('angularApp', ['dialogs.main'])
.controller('TableController', function(dialogs, $http){

    function getEmailAddress(){
        var emailAddress ="empty";
        $http({
            //The http method is defined here, which works as expected
        }).then(function succes(response) {
            emailAddress = response.data;
            console.log(emailAddress + " : getEmailAddress success");//From this log, I can see what I expected
            return emailAddress; //However, this doesn't return the value, which can be seen in the log.
            // return {
            //  emailAddress:emailAddress
            // };  //This way doesn't work either
        }, function resendError() {
            return "Error!";
        });
    };

    this.resendConfirmationMail = function(orderId){
        //Inside this function, the function above is going to be used.
    };
});
</script>
这可能有助于学习异步编程和


这是一个很好的答案,总结了异步函数的使用。

就像您使用
$http
一样

因此,它是异步的。我不太确定这是否是你想要做的,但我觉得最好的一点是,你不能返回一个值,并期望立即消费它。我的意思是这行不通:

function getEmailAddress() {
    return $http({
        //The http method is defined here, which works as expected
    });
}

this.resendConfirmationMail = function (orderId) {
    getEmailAddress().then(function (emailAddress) {
        console.log(emailAddress);
    });
};
您需要做的是返回一个承诺,然后注册说“在承诺解决时运行我的代码”。在这种情况下,一旦
$http
请求返回,承诺将得到解决。正如
$http
为您返回一个承诺一样,您所要做的就是返回它

function test () {
    $http.get('url')
        .then(x => x.data);
}

var data = test();

因此,在您的代码中,只需在
$http

之前返回,您应该使用$q来返回承诺

function test () {
    return $http.get('url')
        .then(x => x.data);
}

test().then(data => {
    //use data
});

您需要从
$http
调用返回承诺,然后在需要值时必须使用
.then()
来检索它

function getEmailAddress(){
        var deferred = $q.defer();
        var emailAddress ="empty";
        $http({
            //The http method is defined here, which works as expected
        }).then(function (response) {
            emailAddress = response.data;
            console.log(emailAddress + " : getEmailAddress success");//From this log, I can see what I expected
             deferred.resolve(emailAddress)
        }, function () {
            deferred.reject(""Error!")
        });
       return deferred.promise;
    };
这里需要记住的重要一点是,
$http
是异步运行的,因此您不能从中“返回值”并在代码中使用该值,除非该代码在
中。然后()
捕获()
成功或失败处理程序中,并且这些处理程序在以后才会运行。

这里您的getEmailAddress函数不返回任何内容。 您必须至少返回$http(它返回一个承诺),并将结果作为承诺进行处理。 或者,您最好在getEmailAddress中创建一个promise实例,并直接在resendConfirmationMail中处理它

angular.module('angularApp', ['dialogs.main'])
.controller('TableController', function(dialogs, $http){

    function getEmailAddress(){
        var emailAddress ="empty";
        return $http({
            //The http method is defined here, which works as expected
        }).then(function succes(response) {
            emailAddress = response.data;
            return emailAddress;
        }, function resendError() {
            return "Error!";
        });
    };

    this.resendConfirmationMail = function(orderId){
        //Inside this function, the function above is going to be used.
        getEmailaAddress().then(function(emailAddress) {
            // use the email address here.
        });
    };
});
有用的文档页面:$q

()

$http实际上返回了一个承诺。另外,一个好的模式是,首先在服务中处理任何与数据相关的操作的返回承诺,然后将该承诺向上传递到可以处理UI操作的控制器。我已经包括了一个简化的plunkr,它显示了这些承诺是如何从服务传递到控制器的。只需单击控制器中的“获取数据”按钮,您将看到事件如何与系列a“alert()s”一起工作。注意,我使用$timeout代替$http。使用$http时,承诺处理将是相同的。详情如下:

html:启动一切。“获取数据”按钮调用getData() 方法在控制器中

mock_ajax_service.js:在这里,服务模拟一个mock ajax调用 使用由控制器按钮调用的$timeout$超时, 与$http非常相似,它返回一个真正的承诺。一旦兑现诺言 返回,它被处理(警报),承诺被传递到 链到控制器(返回该;)


您必须使用
$q.defer()
@cl3m返回承诺,您是正确的OP必须返回承诺,但是在这里使用
$q
将是错误的:
$http
返回承诺,所以他们只需要返回该承诺。如果
$http
@Duncan已经返回了一个非常好的承诺,请不要创建新的承诺,如果存在内部逻辑,则可能需要这些逻辑。也就是说,响应成功,响应中的任何数据都可能指向无效条件。在这种情况下,我需要拒绝它。不,如果数据无效并且您想要拒绝,您只需抛出一个错误。实际上,不需要由
$q
创建单独的承诺,来自
$http
的承诺就足以满足您在此处所需的一切。如果您想要拒绝承诺,请返回
$q.reject()
<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.9/angular.js" data-semver="1.4.9"></script>
    <script src="app.js"></script>
    <script src="mock_ajax_service.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Click on button to request data and handle the promise chain</p>

    <div>
      <button ng-click="getData()">Get Data!</button>
    </div>
  </body>

</html>
var app = angular.module('plunker', ['mockjaxservice_module']);

app.controller('MainCtrl', ['$scope', 'mockajaxservice', 
  function($scope, mockajaxservice) {
  $scope.name = 'World';

        var requestDataSuccess = function (results) {

      console.log('handle success data in controller/UI');
      alert('handle success data in controller/UI');
          return;
        }

        var requestDataFail = function (results) {

          console.log('handle failed data in controller/UI');
          return;
        }     

  $scope.getData = function () {

    var UIPromise = mockajaxservice.requestData();

    UIPromise.then(requestDataSuccess,requestDataFail);
  }
}]);
'use strict';

var mockAjaxModule = angular.module('mockjaxservice_module', []);

mockAjaxModule.factory('mockajaxservice', ['$timeout', function ($timeout) {

    this.service_count = 0;

    this.service_count_object = {

        count:0
    }

    var that = this; 

    var requestDataSuccess = function (results) {
        console.log('handle success data in service');  
        alert('handle success data in service then pass it up to controller');
        that.service_count = 10;
        that.service_count_object.count = 10;
        that.utcTime = Math.floor((new Date()).getTime() / 1000);
      return that;
    }

    var requestDataFail = function (results) {

      console.log('handle failed data in service')
      return that;
    }       

    this.requestData = function () {

        var requestDataPromise = $timeout(function() {

        }, 500);

        requestDataPromise.then(requestDataSuccess,requestDataFail);

        return requestDataPromise;

    }

    return this;

}]);