我们在给angular做拦截器的时候会用到这样的语法。
$httpProvider.responseInterceptors.push('myResponseInterceptor');
myModule.factory('ybResponseInterceptor', ['$window', '$filter', '$q', '$injector', 'securityRetryQueue',
'myConfig', '$timeout',
function ($window, $filter, $q, $injector, queue, ybConfig,$timeout) {
return function (promise) {
// Intercept failed requests
return promise.then(function (response) {...}
...
我很好奇这个promise是怎么来的,为什么会无缘无故的传一个promise进来。于是我请教了大神,大神是这么告诉我的:
我们经常会写这样的代码。
在一个函数里面用另一个函数做一些例如过滤之类的操作
function UpdateCounter(success){
convert(success);
if(success === true){
//...
}else{
//...
}
}
function convert(success){
if( success === "true" ||success == 1)
{
return true;
}
return false;
}
我们在上面的函数里面调用了convert函数,调用的时候传了一个success参数。
在自己的代码里面这样写ok,但是如果要写一个开源库的话,这样写太low,而且可扩展性不好,所以我们应该这样写。
function UpdateCounterServer() {
var convert = [];
function fn_updateCounter(success) {
convert.forEach(function (cb) {
cb(success)
});
if (success === true) {
//...
} else {
//...
}
}
function fn_convert(cb){
convert.push(cb);
}
return{
PushConverter: fn_convert,
UpdateCounter: fn_updateCounter
}
}
UpdateCounterServer.PushConverter(convert);
UpdateCounterServer.UpdateCounter("true");
function convert(success) {
if (success === "true" || success == 1) {
return true;
}
return false;
}
在UpdateCounterServer函数中,我们定义了fn_convert函数用来接收一个函数队列,这里的cb就是接收的函数名称指针。然后在fn_updateCounter函数中我们首先对success参数进行一系列的过滤,如何过滤,就是使用 fn_convert函数接收的函数队列中的函数来过滤的。这是库的写法。
在下面执行的时候我们先把自己定义的convert函数放到函数队列中,然后运行updateconter()。
ok,到了这一步,我们可以进一步模拟实际情况中我们的用法,将convert函数也来封装一下。
function ConvertServer() {
function convert(success) {
if (success === "true" || success == 1) {
return true;
}
return false;
}
return {
Convert: convert
}
}
UpdateCounterServer.PushConverter(ConvertServer.Convert);
UpdateCounterServer.updateCounter("true");
到这里我们可以看到ConvertServer中的convert函数传了一个success,这个success如果单独放在我们自己的代码里面看就会很奇怪,但是结合公共库的代码就很容易理解了。
从这里我们也可以学到公共库文件的一种写法,将对外的接口要抽象出来。