如何从环回中的AngularJS回调函数中获取数据?

时间:2017-05-09 05:46:58

标签: javascript angularjs loopbackjs

我想知道如何从angular函数中检索“good”数组。我有角度的这个功能:

app.run(function($rootScope,Communications,$http,$filter) {

$rootScope.getCommunication = 
function(object_type,val,id,isType,isSendSms,getNotes){

  var array = {};
  var newArr = [];

  // getting data from mysql data 
  var myVals = Communications.find({
        filter: {
          where: {
            and : [{
              communications_type_code : val
            },{
              object_id : id
            },{
              object_type : object_type
            }]
          }
        } 
      }).$promise
        .then(function(data) {

          for(var ind=0; ind<data.length; ind++){
            array['address_type'] = data[ind].address_type;
            array['contact_value'] = data[ind].contact_value;
            array['send_sms'] = data[ind].send_sms;
          }

          newArr.push(array);
           return newArr;
        });
  return newArr;
};
});

当我在Angular控制器中调用这个函数时:

var arr = $rootScope.getCommunication(2,3,$id);
console.log(arr);

我进入控制台是这样的:

enter image description here

当我打电话给arr [0]时,我得到了未定义。 我怎样才能收到这些数据?

2 个答案:

答案 0 :(得分:1)

您需要返回承诺,目前您在更新之前返回数组。异步通过先运行所有同步代码然后运行任何异步来运行。

var arr = []; // runs first
promise.then(function(result){arr = result}) // runs third.
return arr; // runs second 

您需要更改代码才能返回承诺。但是,这也意味着您的调用代码必须处理异步代码。

function asyncFunc() {
 return promise.then(function(result){return result});
}

asyncFunc().then(function(result) {console.log(result)}) // output is the value of result.

在您上面提供的代码的上下文中

app.run(function($rootScope,Communications,$http,$filter) {

$rootScope.getCommunication = 
function(object_type,val,id,isType,isSendSms,getNotes){
  // getting data from mysql data 
  return Communications.find({
        filter: {
          where: {
            and : [{
              communications_type_code : val
            },{
              object_id : id
            },{
              object_type : object_type
            }]
          }
        } 
      }).$promise
        .then(function(data) {
          var array = {};
          var newArray = [];
          for(var ind=0; ind<data.length; ind++){
            array['address_type'] = data[ind].address_type;
            array['contact_value'] = data[ind].contact_value;
            array['send_sms'] = data[ind].send_sms;
          }

          newArr.push(array);
           return newArr;
        });
};
});

和调用函数:

var arr = $rootScope.getCommunication(2,3,$id)
                    .then(function(arr){console.log(arr)})

答案 1 :(得分:0)

您可以按以下方式使用回调

app.run(function($rootScope,Communications,$http,$filter) {

$rootScope.getCommunication = 
function(object_type,val,id,isType,isSendSms,getNotes, callback){

  var array = {};
  var newArr = [];

  // getting data from mysql data 
  var myVals = Communications.find({
        filter: {
          where: {
            and : [{
              communications_type_code : val
            },{
              object_id : id
            },{
              object_type : object_type
            }]
          }
        } 
      }).$promise
        .then(function(data) {

          for(var ind=0; ind<data.length; ind++){
            array['address_type'] = data[ind].address_type;
            array['contact_value'] = data[ind].contact_value;
            array['send_sms'] = data[ind].send_sms;
          }

          newArr.push(array);

           //return using callback
           return callback(newArr);

        });

  //return using callback
  return callback(newArr);

};
});

并使用回调来访问结果

$rootScope.getCommunication(2,3,$id, function(result){
  var arr = result
})