javascript - Vad är det bästa (rätta) sättet att skriva en pollingmetod (med Typescript & AngularJS)?


Jag försöker skriva en pollingmetod som periodiskt frågar en server för att kolla om en zip-fil redan har skapats eller inte.

Det jag vill uppnå är följande:

  1. Anropar (ajax) ett API som skapar en zip-fil på servern
  2. Anropar (ajax) en annan API som kontrollerar om zip-filen redan har skapats (pollningsmetod)
  3. Någon efterföljande process

Här är mitt kodavsnitt ↓

var success: boolean = false;
//1. requests a server to create a zip file
this.apiRequest.downloadRequest(params,ApiUrl.URL_FOR_DOWNLOAD_REQUEST)
.then((resObj) => {
       var apiRes: IDownloadService = resObj.data;
       if (apiRes.status[0].statusCode == "000") {
            success = true;
       } else {
            //Error
       }
}).then(() => {
       if (success) {
         //2. polls the server to check if the zip file is ready
         <- Polling method↓ ->
         this.polling(params).then((zipUrl) => {
                    console.log(zipUrl); //always logs zipUrl
                    //some subsequent process...
         });
       }
});

Skulle någon kunna ge några exempel på opinionsundersökningsmetoder som skulle fungera i det här fallet?

Tillagd :

private polling(params: any): ng.IPromise<any> {
            var poller = () => this.apiRequest.polling(params, ApiUrl.URL_FOR_POLLING);
            var continuation = () => poller().then((resObj) => {
                var apiRes: IDownloadService = resObj.data;
                if (apiRes.zipFilePath == "") {
                    return this.$timeout(continuation, 1000);
                } else {
                    return apiRes.zipFilePath;
                }
            })
            var result: ng.IPromise<any> = continuation();
            return result;          
        }

Svar #1

I princip abstrahera metoderna som visas nedan:

let poll = () => this.apiRequest.downloadRequest(params,ApiUrl.URL_FOR_DOWNLOAD_REQUEST)

let continuation = () => poll().then((/*something*/)=> {
 /*if still bad*/ return continuation();
 /*else */ return good;
})

continuation().then((/*definitely good*/));

Uppdatera

Som begärt i kommentaren nedan:

return this.$timeout(continuation, 1000);

Detta behövs för att få Angular att starta en digestcykel.

Relaterade artiklar