javascript - angular ve typescript ile $q promise'lerini zincirleme hakkında kafa karışıklığı
Q, promises, angular ve typescript ile oldukça deneyimsizim - bu yüzden açıkça akıllıca bir seçim olarak hepsini birlikte kullanmayı denemek gibi göründü!
Temelde, bazı yöntemleri Q.IPromise<T> döndürecek şekilde ayarladım, böylece üzerine bir then(f) ifadesi zincirleyebileyim. İkisi de sorunsuz çalışıyor;
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;
}
Yani onları böyle kullanabilirim;
$articles.Fetch(1).then((r: IArticleRequestData) => {
$articles.Clear().then((n:IArticle) => {
console.log('completed!');
})
});
Bu iyi çalışıyor - ve beklediğim gibi.
Ama şimdi, başka bir adıma ihtiyacım var - bir son arama gibi bir şey. En dıştaki fonksiyonun üzerine eklenen ama en içteki tamamlanana kadar gerçekleşmeyen başka bir then(f) fonksiyonu.
Yani kısaca, buna ihtiyacım var;
$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
});
ve bunu nasıl gerçekleştireceğimi anlamakta çok zorlanıyorum. Promiselerin çalışma şekliyle bu mümkün mü?
ekstra notlar
İç bölüme başka bir işlev eklemek izin verilebilir ama bu yanlış bir yaklaşım gibi görünüyor. Bu, sormaya çalıştığım yolu kesinlikle çözemezsem ya da yapmaya çalıştığım yol tamamen yanlışsa, başvurduğum 'çözümdür'.
İçteki yöntemler aslında belirli şeyleri çözmekten sorumlu olduğu için ekstra then'i dışarıda istiyorum ve bu nedenle diğer dallanmalara veya deferred yöntemlerine de ayrılabilirler.
Cevap #1
İç fonksiyondan promise'i şu şekilde geri döndürün:
$articles.Fetch(1).then((r: IArticleRequestData) => {
return $articles.Clear()
}).then((l:any)=> {
// occurs after everything else is done and inner
// functions are finished
});
