如何知道异步函数调用何时完成(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替换。