对使用 angular 和 typescript 链接 $q promises 感到困惑
confusion about chaining $q promises with angular and typescript
我对 Q
、promises
、angular
和 typescript
非常缺乏经验 - 所以看起来显然明智的选择是尝试将它们一起使用!
基本上我有一些方法设置为 return Q.IPromise<T>
以便我可以将 then(f)
语句链接到它们上。它们都工作正常;
public Clear = (): Q.IPromise<IArticle> => {
var deferred = this.$q.defer();
this.$http({
url: String.format('{0}{1}', this.$settings.uri(), '/api/cancel/article'),
responseType: 'json',
method: 'GET',
withCredentials: true
}).then((response: IArticleRequest) => {
deferred.resolve(response.data.article);
}, (response) => {
deferred.reject(null);
});
return deferred.promise;
}
public Fetch = (id: string):Q.IPromise<IArticleRequestData> => {
var deferred = this.$q.defer();
this.$http({
url: String.format('{0}{1}{2}', this.$settings.uri(), '/api/articles/fetch/', id),
responseType: 'json',
method: 'GET',
withCredentials: true
}).then((response: IArticleRequest) => {
deferred.resolve(response.data);
}, (response) => {
deferred.reject(null);
});
return deferred.promise;
}
所以我可以像这样使用它们;
$articles.Fetch(1).then((r: IArticleRequestData) => {
$articles.Clear().then((n:IArticle) => {
console.log('completed!');
})
});
效果很好 - 正如我所料。
但是现在,我需要 另一个 步骤 - 最后一个 调用之类的。另一个 then(f)
函数在最外层函数上运行,但直到最内层函数完成后才发生。
简而言之,我需要这个;
$articles.Fetch(1).then((r: IArticleRequestData) => {
$articles.Clear().then((n:IArticle) => {
// inner function completed
})
}).then((l:any)=> {
// occurs after everything else is done and inner
// functions are finished
});
我很难弄清楚如何做到这一点。这甚至可以通过 promises 的工作方式实现吗?
补充说明
向内部部分添加另一个功能是允许的,但感觉是错误的方法。如果我完全无法弄清楚我要问的方式,或者我尝试做的方式是错误的,这就是我去 "fix" 的地方。
我想要额外的 then
在外面,因为内部方法实际上负责解决某些事情,因此它们可能会分裂成其他切线或 deferred
方法。
只是 return 来自内部函数的 promise 是这样的:
$articles.Fetch(1).then((r: IArticleRequestData) => {
return $articles.Clear()
}).then((l:any)=> {
// occurs after everything else is done and inner
// functions are finished
});
我对 Q
、promises
、angular
和 typescript
非常缺乏经验 - 所以看起来显然明智的选择是尝试将它们一起使用!
基本上我有一些方法设置为 return Q.IPromise<T>
以便我可以将 then(f)
语句链接到它们上。它们都工作正常;
public Clear = (): Q.IPromise<IArticle> => {
var deferred = this.$q.defer();
this.$http({
url: String.format('{0}{1}', this.$settings.uri(), '/api/cancel/article'),
responseType: 'json',
method: 'GET',
withCredentials: true
}).then((response: IArticleRequest) => {
deferred.resolve(response.data.article);
}, (response) => {
deferred.reject(null);
});
return deferred.promise;
}
public Fetch = (id: string):Q.IPromise<IArticleRequestData> => {
var deferred = this.$q.defer();
this.$http({
url: String.format('{0}{1}{2}', this.$settings.uri(), '/api/articles/fetch/', id),
responseType: 'json',
method: 'GET',
withCredentials: true
}).then((response: IArticleRequest) => {
deferred.resolve(response.data);
}, (response) => {
deferred.reject(null);
});
return deferred.promise;
}
所以我可以像这样使用它们;
$articles.Fetch(1).then((r: IArticleRequestData) => {
$articles.Clear().then((n:IArticle) => {
console.log('completed!');
})
});
效果很好 - 正如我所料。
但是现在,我需要 另一个 步骤 - 最后一个 调用之类的。另一个 then(f)
函数在最外层函数上运行,但直到最内层函数完成后才发生。
简而言之,我需要这个;
$articles.Fetch(1).then((r: IArticleRequestData) => {
$articles.Clear().then((n:IArticle) => {
// inner function completed
})
}).then((l:any)=> {
// occurs after everything else is done and inner
// functions are finished
});
我很难弄清楚如何做到这一点。这甚至可以通过 promises 的工作方式实现吗?
补充说明
向内部部分添加另一个功能是允许的,但感觉是错误的方法。如果我完全无法弄清楚我要问的方式,或者我尝试做的方式是错误的,这就是我去 "fix" 的地方。
我想要额外的 then
在外面,因为内部方法实际上负责解决某些事情,因此它们可能会分裂成其他切线或 deferred
方法。
只是 return 来自内部函数的 promise 是这样的:
$articles.Fetch(1).then((r: IArticleRequestData) => {
return $articles.Clear()
}).then((l:any)=> {
// occurs after everything else is done and inner
// functions are finished
});