在我的申请中,我正在设置var def = $q.defer();
并使用def.resolve(myFunction)
。我很困惑我是否应该保持def局部或只是使它成为一个全局变量,因为它总是等于$q.defer()
。有什么建议?我总是犹豫是否要把某个东西变成一个全局变量,如果它听起来像一个愚蠢的问题,那就很抱歉。
答案 0 :(得分:2)
def
返回的对象(您分配给$q.defer()
)表示单个延迟任务,因此def
应保持为本地。您需要调用$q.defer()
并将结果对象分配给每个延迟任务的变量。正如汤姆在他的回答中所说,对def.resolve()
的同一个实例的def
的后续调用将返回与初始分辨率相同的值,这在某些情况下可能有用(例如,需要的值)从服务器检索,但只需要检索一次并可以缓存,但您不知道第一次检索它的时间可能是因为它取决于用户行为。)
答案 1 :(得分:1)
在您resolve
之后,这将成为引用$q
实例的任何内容的响应。
这是一个示例,在控制器中,将记录"其他内容" 两次,因为它是您的全局$q
对象的第一个分辨率(已解决) 200ms而不是400ms。如果要更改factory1.doSomething()
运行的长度,那么结果将是结果):
Here是一个jsBin。
angular
.module('app', [])
.factory('factory1', factory1)
.factory('factory2', factory2)
.factory('qfactory', qfactory)
.controller('controllerSomething', controllerSomething);
function controllerSomething(factory1, factory2) {
factory1.doSomething().then(function(result) {
console.log(result); // something else
});
factory2.doSomething().then(function(result) {
console.log(result); // something else
});
}
function factory1(qfactory) {
return {
doSomething: function() {
setTimeout(function() {
qfactory.getQ().resolve('something');
}, 400);
return qfactory.getQ().promise;
}
};
}
function factory2(qfactory) {
return {
doSomething: function() {
setTimeout(function() {
qfactory.getQ().resolve('something else');
}, 200);
return qfactory.getQ().promise;
}
};
}
function qfactory($q) {
var q = $q.defer();
return {
getQ: function() {
return q;
}
};
}