编写轮询方法(使用Typescript和AngularJS)的最佳(右)方法是什么?

时间:2015-08-20 08:58:09

标签: javascript ajax angularjs typescript

我正在尝试编写一个轮询方法,定期轮询服务器以检查是否已创建zip文件。

我想要完成的是以下内容:

  1. 调用(ajax)在服务器上创建zip文件的API
  2. 调用(ajax)另一个检查zip文件是否已创建的API(轮询方法)
  3. 一些后续流程
  4. 这是我的代码段↓

    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...
             });
           }
    });
    

    有人可以提供一些在这种情况下可以使用的轮询方法的例子吗?

    添加了:

    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;          
            }
    

1 个答案:

答案 0 :(得分:5)

基本上抽象出如下所示的方法:

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*/));

更新

根据以下评论的要求:

  

返回此。$ timeout(继续,1000);

这需要角度来启动摘要周期。