如何知道异步函数调用何时完成(Javascript)

时间:2015-11-16 03:50:28

标签: javascript angularjs

如果我有一个函数调用callFunc(),并且在该函数内部有一个异步调用(如Angular中的$ http)...我从哪里调用callFunc()对我来说有一些方法知道函数 - 包括其中的所有异步 - 何时完成执行?

4 个答案:

答案 0 :(得分:0)

异步功能在技术上不会返回"已完成"在它完成之前。如果您具有服务控制器的控件,则可以首先向客户端发送响应大小,并且对于发送到客户端的每个数据块,您可以创建自己的进度条以查看它何时完成。但除了调用回调函数之外,没有简单的方法可以看到它是否已完成。

说真的,你的用例是什么?

答案 1 :(得分:0)

取决于您想要做什么,以及调用的异步函数

调用带有可选回调的异步函数

@font-face {  
    font-family: 'BBCNassim';  
    src: url( ../fonts/BBCNassim.TTF );
    src: local("BBCNassim"), url("../fonts/BBCNassim.TTF") format("truetype");  
}

调用需要回调函数的异步函数

function callFunc(callback) {
    // this ones easy, provide a callback or not, doesn't matter
    asynchFunction(callback);
}

调用异步函数并在调用可选提供的回调之前管理结果

function callFunc(callback) {
    // provide a dummy callback if one isn't provided
    callback = callback || function() {}; 
    asynchFunction(callback);
}

替代方案:使用承诺

在$ http

的情况下

function callFunc(callback) {
   function localCallback(param1, param2) {
       var manipulateParams = param1 + param2;
       if(typeof callback == 'function') {
           callback(manipulateParams );
       }
   }
   asynchFunction(localCallback);
}

如果函数没有返回一个promise,那么我们假设它使用" node"惯例

function callFunc() {
    return $http({
        method: 'GET',
        url: 'url'
    });
}

在这两种情况下,您都可以像这样使用callFunc

function callFunc() {
    var deferred = $q.defer();
    somefunc(param, function(err, result) {
        if(err) {
            deferred.reject(err);
        }
        else {
            deferred.resolve(result);
        }
    });
    return deferred.promise;
}

如果没有您的具体细节,那就是我能提供的最好的

答案 2 :(得分:0)

你可以在角度中使用promise。

function callFunc() {
  var deferred = $q.defer();
  $http({
    method: 'GET',
    url: '/someUrl'
  }).then(function successCallback(response) {
    deferred.resolve('success!');
  }, function errorCallback(response) {
    deferred.reject('failed.');
  });
  return deferred.promise;
}

var promise = callFunc();
promise.then(function(res) {
  alert('successCallback: ' + res);
}, function(res) {
  alert('errorCallback: ' + res);
}, function(res) {
  alert('notifyCallback: ' + res);
});

答案 3 :(得分:-1)

以下是带回调功能的javascript代码示例。

Image ImgPic = Image.FromFile("AvtarPic.png");
Image FranceFlagOverlay = Image.FromFile("FranceFlag.png");

Image img = new Bitmap(ImgPic.Width, ImgPic.Height);
using (Graphics gr = Graphics.FromImage(img))
{
    gr.DrawImage(ImgPic, new Point(0, 0));
    gr.DrawImage(FranceFlagOverlay, new Point(0, 0));
}
img.Save("ImgPicWithFranceFlagOverlay.png", ImageFormat.Png);

调用函数的示例

function callFunc( param1, param2, callback ) {

   //your codes of the function 
   //call the callback with some parameters
   window[callback]( param1, param2 );
}

函数调用

中提到的回调函数示例
callFunc( 'this is param1', 'this is param2', 'call_this_function' );