GVKun编程网logo

Angular 2上的Ngrx Store,Effects,Http Ajax轮询设置(javascript 轮询)

17

如果您想了解Angular2上的NgrxStore,Effects,HttpAjax轮询设置的相关知识,那么本文是一篇不可错过的文章,我们将对javascript轮询进行全面详尽的解释,并且为您提供关

如果您想了解Angular 2上的Ngrx Store,Effects,Http Ajax轮询设置的相关知识,那么本文是一篇不可错过的文章,我们将对javascript 轮询进行全面详尽的解释,并且为您提供关于ajax – Angular $http,$q:跟踪进度、ajax – Angular 2 HTTP进度条、ajax – 使用Firefox在AngularJS中使用$http.post成功回调、Angular 2 http.post () 没有发送请求 - Angular 2 http.post () is not sending the request的有价值的信息。

本文目录一览:

Angular 2上的Ngrx Store,Effects,Http Ajax轮询设置(javascript 轮询)

Angular 2上的Ngrx Store,Effects,Http Ajax轮询设置(javascript 轮询)

我正在创建一个Ngrx Angular 2应用程序,并试图让我的http调用在一段时间后继续轮询.我已经看到使用了interval()函数,但是在Ngrx的情况下,当服务调用在@Effect()中完成时,它会给出错误.请指教:

@Injectable()
export class TasksEffects {
constructor(
    private actions$: Actions,private TS: TaskService
){}

@Effect()
onLoadTasksLoadTasks$: Observable<Action> = this.actions$.ofType(tasksActions.ActionTypes.LOAD_TASKS)
    .switchMap(() => {
        return this.TS.index()
            .map((res) => new tasksActions.LoadTasksSuccessAction(res.json()))
            .catch(err => of(new tasksActions.LoadTasksFailAction(err)));
    });

我想每十秒运行一次switchMap功能.这不起作用.

@Effect()
onLoadTasksLoadTasks$: Observable<Action> = this.actions$.ofType(tasksActions.ActionTypes.LOAD_TASKS)
    .switchMap(() => {
        return this.TS.index()
            .map((res) => new tasksActions.LoadTasksSuccessAction(res.json()))
            .catch(err => of(new tasksActions.LoadTasksFailAction(err)));
    }).interval(10000);

类型错误是:

enter image description here

解决方法

如另一个答案所述,interval是一个静态函数,因此在Observable原型中不存在 – 这就是你的错误发生的原因.

相反,你应该能够使用timer实现你想要的.

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/timer';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';

@Effect()
onLoadTasksLoadTasks$: Observable<Action> = this.actions$
  .ofType(tasksActions.ActionTypes.LOAD_TASKS)
  .switchMap(() => Observable
    .timer(0,10000)
    .switchMap(() => this.TS.index()
      .map((res) => new tasksActions.LoadTasksSuccessAction(res.json()))
      .catch(err => Observable.of(new tasksActions.LoadTasksFailAction(err)))
    )
  );

使用计时器,可以指定初始延迟,并在此设置为零,以便计时器立即触发.之后,它将每十秒触发一次,但是如果收到另一个LOAD_TASKS动作,switchMap将看到它取消订阅并创建一个新的计时器等.

ajax – Angular $http,$q:跟踪进度

ajax – Angular $http,$q:跟踪进度

有没有办法跟踪Angular $http和$q的http请求的进度?我正在从URL列表中进行$http调用,然后使用$q.all我将返回所有请求的结果.我想跟踪每个请求的进度(承诺已解决),以便我可以向用户显示一些进度.我正在考虑在承诺得到解决时发出事件,但我不确定它应该在哪里.

var d = $q.defer();
        var promises = [];
        for(var i = 0; i < urls.length; i++){
            var url = urls[i];
            var p = $http.get(url,{responseType: "arraybuffer"});
            promises.push(p);
        }
        $q.all(promises).then(function(result){
            d.resolve(result);
        },function(rejection){
            d.reject(rejection);
        });
        return d.promise;

编辑:
好吧,经过一番摆弄,这就是我想出来的

var d = $q.defer();
        var promises = [];
        var completedCount = 0;
        for(var i = 0; i < urls.length; i++){
            var url = urls[i];
            var p = $http.get(url,{responseType: "arraybuffer"}).then(function(respose){
              completedCount = completedCount+1;
              var progress = Math.round((completedCount/urls.length)*100);
              $rootScope.$broadcast('download.completed',{progress: progress});
              return respose;
            },function(error){
              return error;
            });
            promises.push(p);
        }
        $q.all(promises).then(function(result){
            d.resolve(result);
        },function(rejection){
            d.reject(rejection);
        });
        return d.promise;

不确定这是否是正确的做法.

解决方法

我发现你已经编辑了自己的代码,但是如果你需要更全面的解决方案,请继续阅读

我曾经根据所有待处理的http请求制作了一个进度解决方案(显示某个加载的指示符,类似于youtube在顶部进度条上)

JS:

app.controller("ProgressCtrl",function($http) {

    this.loading = function() {
        return !!$http.pendingRequests.length;
    };

});

HTML:

<div id="fixedTopBar" ng-controller="ProgressCtrl as Progress">
    <div id="loading" ng-if="Progress.loading()">
        loading...
    </div>
</div>

.

性交

对于我的最新项目,它不仅仅是请求请求.我开始进入套接字,webworker,文件系统,文件读取器,dataChannel和任何其他使用$q的异步调用.所以我开始研究如何获得所有未决的承诺(包括$http).原来没有任何有角度的解决方案,所以我有点猴子在decorating修补了$q提供商.

app.config(function($provide) {

    $provide.decorator("$q",function($delegate) {
        // $delegate == original $q service

        var orgDefer = $delegate.defer;
        $delegate.pendingPromises = 0;

        // overide defer method 
        $delegate.defer = function() {
            $delegate.pendingPromises++; // increass
            var defer = orgDefer();

            // decreass no mather of success or faliur
            defer.promise['finally'](function() {
                $delegate.pendingPromises--;
            });

            return defer;
        }

        return $delegate
    });

});

app.controller("ProgressCtrl",function($q) {

    this.loading = function() {
        return !!$q.pendingPromises;
    };

});

这可能不适合每个人的生产需求,但它可能对开发人员有用,看看是否有任何未解决的问题留下并永远不会被调用

ajax – Angular 2 HTTP进度条

ajax – Angular 2 HTTP进度条

目前Angular 2中有一种方法可以使用angular2 / http模块检索ajax调用的进度(即完成百分比)吗?

我使用以下代码进行HTTP调用:

let body = JSON.stringify(params);
        let headers = new Headers({ 'Content-Type': 'application/json' });
        let options = new RequestOptions({ headers: headers });
        this.http.post(url,body,options)
            .timeout(10000,new Error('Timeout exceeded during login'))
            .toPromise()
            .then((res) => {
                ...
            }).catch((err) => {
                ...
            });

目标是编写同步系统.该帖子将返回大量数据,我想让用户了解同步需要多长时间.

解决方法

目前(从v.3.3.0开始,当使用来自@ ngular / common / http的新HttpClient时)Angular提供了开箱即用的收听功能.您只需要创建HTTPRequest对象,如下所示:

import { HttpRequest } from '@angular/common/http';
...

const req = new HttpRequest('POST','/upload/file',file,{
  reportProgress: true,});

当您订阅请求时,您将在每个进度事件中收到订阅:

http.request(req).subscribe(event => {
  // Via this API,you get access to the raw event stream.
  // Look for upload progress events.
  if (event.type === HttpEventType.UploadProgress) {
    // This is an upload progress event. Compute and show the % done:
    const percentDone = Math.round(100 * event.loaded / event.total);
    console.log(`File is ${percentDone}% uploaded.`);
  } else if (event instanceof HttpResponse) {
    console.log('File is completely uploaded!');
  }
});

更多信息here.

ajax – 使用Firefox在AngularJS中使用$http.post成功回调

ajax – 使用Firefox在AngularJS中使用$http.post成功回调

我在AngularJS应用程序中有一个简单的CORS AJAX调用,并且成功回调:

$http({method:'POST',url:"http://0.0.0.0:4567/authenticate",params: {Lusername:scope.Lusername,Lpassword:scope.Lpassword}})
 .success(function(){alert("Success")})

在Safari中使用时,它可以正常工作:返回预期的JSON对象并显示警告框.但是在Firefox中,虽然正确返回了JSON对象,但不会触发成功回调.

知道为什么吗?

解决方法

确保在服务器中处理OPTIONS请求.如果它返回404,则Firefox不会调用下一个请求(在您的情况下是上面提到的POST).

Angular 2 http.post () 没有发送请求 - Angular 2 http.post () is not sending the request

Angular 2 http.post () 没有发送请求 - Angular 2 http.post () is not sending the request

问题:

When I make a post request the angular 2 http is not sending this request 当我发出帖子请求时,angular 2 http 没有发送此请求

this.http.post(this.adminUsersControllerRoute, JSON.stringify(user), this.getRequestOptions())

the http post is not sent to the server but if I make the request like this http post 不会发送到服务器,但如果我发出这样的请求

this.http.post(this.adminUsersControllerRoute, JSON.stringify(user), this.getRequestOptions()).subscribe(r=>{});

Is this intended and if it is can someone explain me why ? 这是有意的,如果是的话,有人可以解释我为什么吗? Or it is a bug ? 或者它是一个错误?


解决方案:

参考: https://stackoom.com/en/question/2RvXo

关于Angular 2上的Ngrx Store,Effects,Http Ajax轮询设置javascript 轮询的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于ajax – Angular $http,$q:跟踪进度、ajax – Angular 2 HTTP进度条、ajax – 使用Firefox在AngularJS中使用$http.post成功回调、Angular 2 http.post () 没有发送请求 - Angular 2 http.post () is not sending the request的相关信息,请在本站寻找。

本文标签: