通过 Promise 链传递数据 (angularjs)
Passing Data through Promise Chain (angularjs)
这个问题很难描述,所以让我 post 举个例子。
上下文是 AngularJS $q
,但也欢迎任何基于 ES6 Promise
的解决方案。
假设我们要取消一个 $http
请求。在 AngularJS 中,这是通过向 $http.get()
方法提供承诺 A 来实现的。解决承诺 A 将导致取消请求。所以代码将如下所示:
function httpCall() {
const promiseA = $q.defer();
const promiseB = $http.get(url, { timeout: promiseA.promise });
return promiseB;
}
为了returnpromiseA
让httpCall
的调用者可以取消请求,我找到的唯一办法就是赋值给promiseB
,比如这个:
function httpCall() {
const promiseA = $q.defer();
let promiseB = $http.get(url, { timeout: promiseA });
promiseB.canceller = promiseA;
return promiseB;
}
问题是,promiseB
可能会通过一个很长的promise链传递(比如action dispatch,mapping,其他post-processes),例如:
function doSomeAction() {
return httpCall()
.then((response) => {
processResponse(response);
return response;
});
}
显然,doSomeAction
的 return 值与原始承诺 promiseB
不同。
因此,如果我有一个调用 doSomeAction()
的函数,该函数将无法检索 promiseB
(它只能获得 doSomeAction()
的 return 承诺), 因此无法取消请求。
有人可能会说我们可以通过链传递数据(promiseA
)。但是我认为 promiseA
的存在对链本身应该是透明的,即链中的函数永远不应该知道 promiseA
的存在。因此我不能依赖链为我传递数据。
欢迎提出任何建议。
不知道 promiseA
完全有道理,因为事情发生在不同的抽象层次上。 doSomeAction
抽象出 http 调用并提供任何取消底层 http 调用的 API 会破坏抽象并揭示 doSomeAction
的实现细节。相反,我会考虑使 doSomeAction
可取消,即在它 returns 的对象上提供 cancel
方法。这种取消方法可以取消底层的 http 请求(如果有多个,则可以取消其中的几个)或者如果没有发出 http 请求并且数据是从本地存储中获取的,或者做任何对 doSomeAction
有意义的事情,而不仅仅是特定的 http,则跳过取消request 这只是这一层更大图片的一部分。
这个问题很难描述,所以让我 post 举个例子。
上下文是 AngularJS $q
,但也欢迎任何基于 ES6 Promise
的解决方案。
假设我们要取消一个 $http
请求。在 AngularJS 中,这是通过向 $http.get()
方法提供承诺 A 来实现的。解决承诺 A 将导致取消请求。所以代码将如下所示:
function httpCall() {
const promiseA = $q.defer();
const promiseB = $http.get(url, { timeout: promiseA.promise });
return promiseB;
}
为了returnpromiseA
让httpCall
的调用者可以取消请求,我找到的唯一办法就是赋值给promiseB
,比如这个:
function httpCall() {
const promiseA = $q.defer();
let promiseB = $http.get(url, { timeout: promiseA });
promiseB.canceller = promiseA;
return promiseB;
}
问题是,promiseB
可能会通过一个很长的promise链传递(比如action dispatch,mapping,其他post-processes),例如:
function doSomeAction() {
return httpCall()
.then((response) => {
processResponse(response);
return response;
});
}
显然,doSomeAction
的 return 值与原始承诺 promiseB
不同。
因此,如果我有一个调用 doSomeAction()
的函数,该函数将无法检索 promiseB
(它只能获得 doSomeAction()
的 return 承诺), 因此无法取消请求。
有人可能会说我们可以通过链传递数据(promiseA
)。但是我认为 promiseA
的存在对链本身应该是透明的,即链中的函数永远不应该知道 promiseA
的存在。因此我不能依赖链为我传递数据。
欢迎提出任何建议。
不知道 promiseA
完全有道理,因为事情发生在不同的抽象层次上。 doSomeAction
抽象出 http 调用并提供任何取消底层 http 调用的 API 会破坏抽象并揭示 doSomeAction
的实现细节。相反,我会考虑使 doSomeAction
可取消,即在它 returns 的对象上提供 cancel
方法。这种取消方法可以取消底层的 http 请求(如果有多个,则可以取消其中的几个)或者如果没有发出 http 请求并且数据是从本地存储中获取的,或者做任何对 doSomeAction
有意义的事情,而不仅仅是特定的 http,则跳过取消request 这只是这一层更大图片的一部分。