Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过承诺链传递数据(angularjs)_Javascript_Angularjs_Promise_Angular Promise_Angularjs Http - Fatal编程技术网

Javascript 通过承诺链传递数据(angularjs)

Javascript 通过承诺链传递数据(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

这个问题很难描述,所以让我举个例子。 上下文是AngularJS
$q
,但也欢迎基于ES6
Promise
的任何解决方案

假设我们想要取消一个
$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()
)。虽然我仍在试图找出如何使其通用,但我将把它作为最后一个解决方案。谢谢@nuticThe
timeout
属性的$http配置应该是一个承诺。变量
promiseA
不是承诺对象;这是一个推迟的计划。承诺对象是
$q.deferred().promise