从作为参数传入的函数返回一个值

时间:2016-11-16 20:11:53

标签: javascript

我正在尝试按照此页面上的异步问题/指南,特别是“如果您未在代码中使用jQuery,这个答案适合您”的答案问题:How do I return the response from an asynchronous call?但我似乎无法获得返回var的值。

function maxYvalue2(whendone) {
  Rpt_scn_cost_v.find({
    filter: {
      where: {
        scenario_id: $stateParams.id
      }
    }
  }).$promise.then(function(response) {
    var maxYvalue = 0
    for (i = 0; i < response.length; i++) {
      currMaxYvalue = parseFloat(response[i].cur_cost) + parseFloat(response[i].tgt_cost);
      if (currMaxYvalue > maxYvalue) {
        maxYvalue = currMaxYvalue
      };
    }
    console.log("y3: " + maxYvalue)
    whendone(maxYvalue);
    return maxYvalue;
  });
  return maxYvalue;
};

function onComplete(maxYvalue1) {

  mxVal = maxYvalue;

  console.log("mx: " + mxVal)

  return mxVal;

};

var yVal = maxYvalue2(onComplete);
console.log("fnc: " + yVal);

但是yVal仍然显示为未定义...我按照上一个问题/答案但仍然无法获得指南中的输出....

我正在尝试遵循代码中提到的这种结构:

function onComplete(a){ // When the code completes, do this
    alert(a);
}

function getFive(whenDone){ 
    var a;
    setTimeout(function(){
         a=5;
         whenDone(a);
    },10);
}

然后像这样调用它:

getFive(onComplete);

我是否在参考问题中遵循了正确的回复部分?

1 个答案:

答案 0 :(得分:2)

Promise不会使代码同步。您永远无法立即从maxYvalue2返回值。只需返回承诺:

function maxYvalue2() {
    return Rpt_scn_cost_v.find({filter: { where: {scenario_id: $stateParams.id}}}).$promise.then(function(response){
        var maxYvalue = 0
        for (var i=0;i<response.length;i++) {
            var currMaxYvalue = parseFloat(response[i].cur_cost) + parseFloat(response[i].tgt_cost);
            if (currMaxYvalue > maxYvalue) {
                maxYvalue = currMaxYvalue
            };
        }
        console.log("y3: " + maxYvalue)
        return maxYvalue;
    });
}

maxYvalue2().then(function onComplete(yVal) {
    console.log("fnc: " + yVal);
});