Angularjs qazxsw poi是受Kris Kowal的Q启发的承诺/延期实施。
在Q中,您创建了一个承诺
$q
这里将异步调用var myPromise = Q.fcall(myFunction);
,将承诺放在myFunction
变量中并继续执行代码。
myPromise
Angular用于创建一个承诺是使用javascript only example函数,对我来说,与上面的Q示例相比,这似乎是一个冗长的hack。所以在Angular我会写
timeout
以上内容与顶部的单线程相同。
我希望function asyncWorker(name) {
var deferred = $q.defer();
setTimeout(function() {
scope.$apply(function() {
deferred.resolve(myFunction);
});
}, 1000);
return deferred.promise;
}
能够奏效但我得到:
$q.fcall
那么在AngularJS中异步调用函数和返回promise的最简单方法是什么?
你在寻找这样的东西吗?
TypeError: 'undefined' is not a function (evaluating '$q.fcall(function() { return 'a'; })')
现在你调用这个函数
function doWorkAsync() {
var defer = $q.defer();
//do some work async and on a callback
asyncWork(function(data)) {
defer.resolve(data);
}
return defer.promise;
}
angularJS库函数的数量已经在调用时返回一个promise。像doWorkAsync().then(function(data));
,$timeout
,$http
。
我不知道这是否很聪明,但它对我有用:
$resource
好吧,更清洁的替代方案是注入Angular的function fcall(someValues) {
var deferrd = $q.defer();
deferrd.resolve(someValues);
return deferrd.promise;
}
fcall(123).then(function(values) {
console.log(values); // 123
});
,让我们再说一下,函数$timeout
是我想异步做的工作,我只会这样做:
myFunction
当function doWorkAsync() {
return $timeout(myFunction, 10);
}
完成它的工作时,doWorkAsync
将返回一个将被解决的承诺。
对于单元测试,我可以调用myFunction
立即触发超时功能。
$timeout.flush()
您可以使用$ q作为类似于ES6工作方式的构造函数。
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
}
}
function asyncGreet(name) {
return $q(function(resolve, reject) {
resolve('Hello, ' + name + '!');
});
}
你可以使用qazxsw poi来模仿qazxsw poi。它稍微冗长,但它的工作原理相同。
angular docs
其中Q.fcall(fn)
可以是异步的,也可以是同步的,并且将使用未定义的参数调用。
工作范例:
$q.when().then(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);
});
}]
相同。