在函数完成后运行代码并获取返回值

时间:2015-09-24 12:55:20

标签: javascript callback

想象一下,我有一个简单的javascript函数:

  function someFunction(integer)
  {
    data = integer + 1;
    return data;
  }

我需要从另一个函数内部调用它并使用返回的值:

  function anotherFunction(integer)
  {
    int_plus_one = someFunction(integer);
    //Do something with the returned data...
    int_plus_two = int_plus_one + 1;
    return int_plus_two;
  }

如何确保仅在someFunction完成后返回anotherFunction返回的返回?它实际上似乎与这些非常快的功能一起正常工作。但是,如果someFunction必须执行一些ajax查找,则aotherFunction的返回将失败。

谢谢, 史蒂夫

5 个答案:

答案 0 :(得分:3)

您不知道何时或甚至是否会完成异步功能。处理此问题的唯一方法是使用回调函数,该函数在异步操作完成后执行。

这是我的#啊;啊哈!"时刻:How to return the response from an asynchronous call?

答案 1 :(得分:0)

就您的代码同步而言,上述方法很好。

一旦开始引入异步部分,下面涉及回调的部分是一种常用的方法:

function fn (v, cb) {
    doSomethingAsyncWithV(function (err, _v) {
        if(err) return cb(err);
        cb(null, _v);
    })
}

function yourFirstFn () {
    var v = 0;
    fn(v, function (err, _v) {
        // do here whatever you want with the asynchronously computed value
    });
}

答案 2 :(得分:0)

承诺怎么样?考虑到这一点,没有必要担心回调。这是AngularJS中很酷的事情之一。

var q = require('q');

var myPromise =function() {
    var deferred = q.defer();
    setTimeout(function(){  
        var output = anotherFunction(1);
        deferred.resolve(output)
    }, 10000);  // take times to compute!!! 
    return deferred.promise;
}

var objPromise = myPromise();
objPromise.then(function(outputVal){
    console.log(outputVal) ; // your output value from anotherFunction
}).catch(function(reason) {
    console.log('Error: ' + reason);
})

然后只有在承诺解决后才会执行。如果捕获到异常或错误,则执行catch函数。

答案 3 :(得分:0)

怎么样?

   function someFunction(integer, callback)
   {
       data = integer + 1;
       return callback(data);
   }



  function anotherFunction(integer)
  {
     int_plus_one = someFunction(integer, function(data){
         int_plus_two = int_plus_one + 1;
         return int_plus_two;
     });
    //Do something with the returned data...

  }

答案 4 :(得分:0)

你可以使用承诺:

new Promise(function someFunction(resolve, reject) {
    ajaxLib.get(url, options, function (data) {
        resolve(data);
    });
}).then(function anotherFunction(integer)
  {
    int_plus_one = integer;
    //Do something with the returned data...
    int_plus_two = int_plus_one + 1;
    return int_plus_two;
});

如果你使用jQuery,$.ajax会返回一个thenable:

$.ajax(url, options).then(function processDataFromXHR(data) {
     return data.integer;
}).then(function anotherFunction(integer){
    int_plus_one = integer;
    //Do something with the returned data...
    int_plus_two = int_plus_one + 1;
    return int_plus_two;
});