Angulars $q
是一个受 Kris Kowal 的 Q 启发的承诺/延迟实现。
在 Q 中,您创建承诺
var myPromise = Q.fcall(myFunction);
在这里,myFunction
将被异步调用,承诺被放置在myPromise
变量中,代码执行将继续。
Angular 给出的创建承诺的唯一示例是使用 javascript timeout
函数,与上面的 Q 示例相比,这对我来说似乎是一个冗长的黑客。所以在 Angular 中我会写
function asyncWorker(name) {
var deferred = $q.defer();
setTimeout(function() {
scope.$apply(function() {
deferred.resolve(myFunction);
});
}, 1000);
return deferred.promise;
}
以上内容将与顶部的单行相同。
我希望$q.fcall
会起作用,但我得到:
TypeError: 'undefined' is not a function (evaluating '$q.fcall(function() { return 'a'; })')
那么在 AngularJS 中异步调用函数并返回承诺的最直接方法是什么?
你在寻找这样的东西吗
function doWorkAsync() {
var defer = $q.defer();
//do some work async and on a callback
asyncWork(function(data)) {
defer.resolve(data);
}
return defer.promise;
}
现在你调用这个函数
doWorkAsync().then(function(data));
angularJS库函数的数量已经在调用时返回了一个承诺。像$timeout
、$http
、$resource
。
这是否很聪明,但它对我有用:
function fcall(someValues) {
var deferrd = $q.defer();
deferrd.resolve(someValues);
return deferrd.promise;
}
fcall(123).then(function(values) {
console.log(values); // 123
});
好的,更干净的替代方案是注入 Angular 的$timeout
,让我们再次说函数myFunction
是我想异步完成的工作,我只做:
function doWorkAsync() {
return $timeout(myFunction, 10);
}
doWorkAsync
将返回一个承诺,该承诺将在myFunction
完成工作时解决。
对于单元测试,我可以调用$timeout.flush()
来立即触发超时函数。
function createPromise(func) {
return function (params) {
var deferred = $q.defer();
$timeout(function () {
try {
var rtn = func(params);
deferred.resolve(rtn);
}
catch (ex) {
deferred.reject();
}
})
return deferred.promise
}
}
您可以将$q用作类似于 ES6 工作的构造函数。
function asyncGreet(name) {
return $q(function(resolve, reject) {
resolve('Hello, ' + name + '!');
});
}
角度文档
$q.when().then(fn)
来模仿Q.fcall(fn)
。它稍微啰嗦一些,但它的工作原理相同。
var myPromise = $q.when().then(myFunction);
其中myFunction
可以是异步的,也可以是同步的,并且将使用未定义的参数进行调用。
工作示例:
// Node.js
var Q = require('q');
var updatePromise = Q.fcall(function() {
if (isUpdate) {
return doAsyncUpdate();
} else {
return doSyncDelete();
}
}).catch(function(err) {
handleError(err);
});
// AngularJS
['$q', function($q) {
var updatePromise = $q.when().then(function() {
if (isUpdate) {
return doAsyncUpdate();
} else {
return doSyncDelete();
}
}).catch(function(err) {
handleError(err);
});
}]
文档:https://docs.angularjs.org/api/ng/service/$q#when。
请注意,$q.when
的工作方式与 Q.when
相同。