我是否应该保留等于$q.defer()的变量,使其具有词法作用域?
Should I keep the variable that equals $q.defer() to have lexical scope?
在我的应用程序中,我设置var def = $q.defer();
并使用def.resolve(myFunction)
。我很困惑我是否应该保持deflocal或只是让它成为一个全局变量,因为它总是等于$q.defer()
。有什么建议吗?我总是犹豫,使一些全局变量所以抱歉,如果它可能听起来像一个愚蠢的问题。
由$q.defer()
返回的对象(您正在分配给def
)表示单个延迟的任务,因此def
应该保持本地。您将需要调用$q.defer()
并将结果对象分配给每个单独延迟任务的变量。正如Tom在他的回答中所说,对于def
的相同实例,后续对def.resolve()
的调用将返回与初始解析相同的值,这在某些情况下可能是有用的(例如,需要从服务器检索的值,但只需要检索一次并且可以缓存,但你不知道第一次尝试检索它可能是什么时候,因为它取决于用户行为)。
在你resolve
一次之后,这将是任何引用$q
实例的响应。
$q
对象的第一个分辨率(分辨率为200ms而不是400ms)。如果您要更改factory1.doSomething()
运行的长度,那么结果将是):
这是一个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;
}
};
}
相关文章:
- 带有KendoUI组件的Javascript变量作用域
- Javascript变量作用域:从回调函数中提取变量
- 使用JavaScript回调函数了解变量作用域和闭包
- jquery.post和变量作用域
- 变量作用域:在函数之间传递的名称
- 在 AJAX 和 Javascript 中使用变量和变量作用域
- 节点.js/express.js中的变量作用域
- jquery ajax 回调变量作用域(为什么有些在作用域中,而另一些则不在作用域中)
- JavaScript 中的变量作用域
- ajax GET 和 POST 中的变量作用域
- Javascript:变量作用域和全局变量的弊端
- Javascript 自执行函数和变量作用域
- 拼接上的Javascript全局变量作用域/覆盖
- 在Node中与jsdom和jquery共享变量作用域
- NodeJS:代码优化和变量作用域
- Javascript数组变量作用域
- AngularJS ng控制器指令不接受javascript中的变量(作用域函数),也不给出任何错误
- 回调函数中的变量作用域呢
- JavaScript/jQuery变量作用域导致错误
- AJAX变量作用域