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)_Javascript_Angularjs - Fatal编程技术网

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

如何知道异步函数调用何时完成(Javascript),javascript,angularjs,Javascript,Angularjs,如果我有一个函数调用callFunc(),并且在该函数中有一个异步调用(如Angular中的$http)。。。从哪里调用callFunc()是否有办法知道函数(包括其中的所有异步函数)何时完成执行?异步函数从技术上讲不会在完成之前返回“已完成”的指示符。如果您拥有服务控制器的控件,则可以首先向客户端发送响应大小,对于发送到客户端的每个数据块,您可以制作自己的进度条,以查看何时完成。但除了调用回调函数外,没有简单的方法可以查看它是否完成 说真的,您的用例是什么?这里是一个带有回调函数的javasc

如果我有一个函数调用
callFunc()
,并且在该函数中有一个异步调用(如Angular中的$http)。。。从哪里调用
callFunc()
是否有办法知道函数(包括其中的所有异步函数)何时完成执行?

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


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

这里是一个带有回调函数的javascript代码示例

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' );
函数调用中提到的回调函数示例

function call_this_function( param1, param2 ) {

    //do something
}

这取决于您想要做什么,以及所涉及的异步函数

调用接受可选回调的异步函数

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);
}
调用异步函数并在调用可选提供的回调之前管理结果

function callFunc(callback) {
   function localCallback(param1, param2) {
       var manipulateParams = param1 + param2;
       if(typeof callback == 'function') {
           callback(manipulateParams );
       }
   }
   asynchFunction(localCallback);
}
备选方案:使用承诺

在$http的情况下

function callFunc() {
    return $http({
        method: 'GET',
        url: 'url'
    });
}
对于不返回承诺的函数,假设它使用“节点”约定

function callFunc() {
    var deferred = $q.defer();
    somefunc(param, function(err, result) {
        if(err) {
            deferred.reject(err);
        }
        else {
            deferred.resolve(result);
        }
    });
    return deferred.promise;
}
在这两种情况下,您都可以像这样使用callFunc

callFunc().then(function(res) {
    console.log('success', res);
}, function(res) {
    console.log('error', res);
});

如果没有您提供的具体细节,这是我所能提供的最好的了。

您可以使用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);
});

所有异步函数都提供一个回调函数,该函数在异步函数完成时被调用。是的,但该回调函数只能在
callFunc()
内部工作-我希望调用
callFunc()
的函数知道。如果您编写了
callFunc
,请重写它以接受回调(如果您有此倾向,请返回承诺)如果有时我实际上不需要回调,我应该如何编写它呢?只要
返回
$http
返回给调用方的承诺
$http
返回一个承诺-因此,我知道,您的
callFunc
不必如此冗长或复杂。这只是问题的一个例子。$http可以被任何func替换。