一連のプロミスを同期して実行し、最初のプロミスが完了するまで2回目のプロミスが実行されないようにするにはどうすればよいですか?ここでは、3つのチャンクをロードしています。それぞれのクライアントは10の長さで、残りはロードします。ここでのアイデアは、残りの部分がロードされている間に最初のN個のクライアントを表示することです。フラット化同期角度プラン
私が望ましくないことは、以下のように、processChunk1()、then(()=> processChunk2())などを明示的に言う必要があることです。クライアントがなくなるまでループ内でチャンクを処理したい。どんな助けもありがとう!それを行うには
loadPerformanceDtos(): ng.IPromise<{}> {
var deferred = this.$q.defer();
var clientList: any = [];
$.extend(clientList, this.$location.search().client);
// If the user only searched for one client, we need to turn it into an array
if (!angular.isArray(clientList)) {
clientList = [clientList];
}
var that = this;
// Sort so we can chunk it
var sortedClients: string[] = (<string[]>clientList).sort();
const chunkSize: number = 10;
// Reset page's data
this.performanceDtoModels = [];
// Set up three chunks to load in order
var chunk1: string[] = sortedClients.splice(0, chunkSize);
var chunk2: string[] = sortedClients.splice(0, chunkSize);
var chunk3: string[] = sortedClients.splice(0, chunkSize);
// I don't want to have to explicitly define the groups below, I want this to be in a loop
processChunk(chunk1).then(() => {
// Resolve the inital page's progress bar
deferred.resolve();
processChunk(chunk2).then(() => {
processChunk(chunk3).then(() => {
processChunk(sortedClients);
});
});
});
function processChunk(chunk: string[]) {
var chunkDeferred = that.$q.defer();
if (chunk.length === 0) {
chunkDeferred.resolve();
} else {
that.performanceService.loadPerformanceData(chunk)
.success((data: IPerformanceDtoModel[]) => {
data.forEach((item: IPerformanceDtoModel) => {
// Add the final item to the page
that.performanceDtoModels.push(item);
});
chunkDeferred.resolve();
});
}
return chunkDeferred.promise;
}
return deferred.promise;
}
これは私が必要としていたものです。私は意図的に簡潔にエラー処理を省略し、それを自分で処理することができます。私が見つけたすべてのリソースは、あなたが有望な数の有望チェーンを持っていることを期待しているので、それを一般化するためのある方向性が必要でした。 – user2339814