Javascript 通过承诺链传递数据(angularjs)
这个问题很难描述,所以让我举个例子。 上下文是AngularJSJavascript 通过承诺链传递数据(angularjs),javascript,angularjs,promise,angular-promise,angularjs-http,Javascript,Angularjs,Promise,Angular Promise,Angularjs Http,这个问题很难描述,所以让我举个例子。 上下文是AngularJS$q,但也欢迎基于ES6Promise的任何解决方案 假设我们想要取消一个$http请求。在AngularJS中,这是通过向$http.get()方法提供承诺来实现的。解决承诺A将导致取消请求。因此,代码将如下所示: function httpCall() { const promiseA = $q.defer(); const promiseB = $http.get(url, { timeout: promise
$q
,但也欢迎基于ES6Promise
的任何解决方案
假设我们想要取消一个$http
请求。在AngularJS中,这是通过向$http.get()
方法提供承诺来实现的。解决承诺A将导致取消请求。因此,代码将如下所示:
function httpCall() {
const promiseA = $q.defer();
const promiseB = $http.get(url, { timeout: promiseA.promise });
return promiseB;
}
function httpCall() {
const promiseA = $q.defer();
let promiseB = $http.get(url, { timeout: promiseA });
promiseB.canceller = promiseA;
return promiseB;
}
为了返回promiseA
,以便httpCall
的调用方可以取消请求,我找到的唯一方法是将其分配给promiseB
,如下所示:
function httpCall() {
const promiseA = $q.defer();
const promiseB = $http.get(url, { timeout: promiseA.promise });
return promiseB;
}
function httpCall() {
const promiseA = $q.defer();
let promiseB = $http.get(url, { timeout: promiseA });
promiseB.canceller = promiseA;
return promiseB;
}
问题是,promiseB
可能通过一个长的承诺链传递(例如动作分派、映射、其他后期处理),例如:
function doSomeAction() {
return httpCall()
.then((response) => {
processResponse(response);
return response;
});
}
显然,doSomeAction
的返回值与原始承诺promiseB
不同
因此,如果我有一个调用doSomeAction()
,此函数将无法检索promiseB
(它只能获得doSomeAction()
)的返回承诺),因此无法取消请求
有人可能会说我们可以通过链条传递数据(promiseA
)。但是,我认为代码< >允诺< /代码>的存在应该对链本身是透明的,即链中的函数不应该知道<代码>允诺< /代码>的存在。因此,我不能依靠链为我传递数据
欢迎提出任何建议。不知道promiseA完全有道理,因为事情发生在不同的抽象层次上
doSomeAction
抽象出http调用,提供任何取消底层http调用的API都会破坏抽象并揭示doSomeAction
的实现细节。相反,我会考虑将doSomeAction
设置为可取消的,即对它返回的对象提供cancel
方法。此cancel方法可以取消底层http请求(如果有多个请求,则可以取消其中的几个请求),或者在没有发出http请求且数据是从本地存储中获取的情况下跳过取消,或者执行对doSomeAction
有意义的任何操作,不仅仅是特定的http请求,它只是这一层的一部分。考虑到链可能很复杂(例如,$q.all()
)。虽然我仍在试图找出如何使其通用,但我将把它作为最后一个解决方案。谢谢@nuticThetimeout
属性的$http配置应该是一个承诺。变量promiseA
不是承诺对象;这是一个推迟的计划。承诺对象是$q.deferred().promise
。