标签: angular-promise

Promises和Observables有什么区别?

有人可以解释Angular Promise和之间的区别Observable吗?

每个例子都有助于理解这两种情况.在什么情况下我们可以使用每个案例?

promise rxjs angular-promise angular angular-observable

1291
推荐指数
26
解决办法
42万
查看次数

AngularJS:使用异步数据初始化服务

我有一个AngularJS服务,我想用一些异步数据进行初始化.像这样的东西:

myModule.service('MyService', function($http) {
    var myData = null;

    $http.get('data.json').success(function (data) {
        myData = data;
    });

    return {
        setData: function (data) {
            myData = data;
        },
        doStuff: function () {
            return myData.getSomeData();
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

显然这不会起作用,因为如果某些东西doStuff()myData返回之前尝试调用,我将得到一个空指针异常.据我所知,从这里这里提出的其他一些问题,我有几个选择,但没有一个看起来很干净(也许我错过了一些东西):

使用"运行"设置服务

设置我的应用时,请执行以下操作:

myApp.run(function ($http, MyService) {
    $http.get('data.json').success(function (data) {
        MyService.setData(data);
    });
});
Run Code Online (Sandbox Code Playgroud)

然后我的服务看起来像这样:

myModule.service('MyService', function() {
    var myData = null;
    return {
        setData: function (data) {
            myData = data;
        },
        doStuff: function () {
            return myData.getSomeData();
        } …
Run Code Online (Sandbox Code Playgroud)

javascript service asynchronous angularjs angular-promise

472
推荐指数
7
解决办法
21万
查看次数

如何在AngularJS中取消$ http请求?

给出AngularJS中的Ajax请求

$http.get("/backend/").success(callback);
Run Code Online (Sandbox Code Playgroud)

如果启动另一个请求(相同的后端,例如不同的参数),取消该请求的最有效方法是什么.

promise cancellation angularjs angular-http angular-promise

184
推荐指数
5
解决办法
11万
查看次数

如何获取承诺的价值?

我正在从Angular的文档中看到这个例子,$q但我认为这可能适用于一般的承诺.他们有这个例子,逐字复制他们的评论包括:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Run Code Online (Sandbox Code Playgroud)

我不清楚这是如何工作的.如果我可以调用.then()第一个的结果.then(),链接它们,我知道我可以,那么promiseB是一个类型的promise对象Object.它不是Number.那么他们的意思是"它的价值将是promiseA增加1的结果"?

我应该promiseB.value像那样访问它吗?成功回调如何返回一个承诺并返回"结果+ 1"?我错过了什么.

javascript promise angularjs angular-promise

117
推荐指数
5
解决办法
20万
查看次数

等待所有承诺解决

所以我有一种情况,我有多个未知长度的承诺链.我希望在处理完所有CHAINS后运行一些操作.这甚至可能吗?这是一个例子:

app.controller('MainCtrl', function($scope, $q, $timeout) {
    var one = $q.defer();
    var two = $q.defer();
    var three = $q.defer();

    var all = $q.all([one.promise, two.promise, three.promise]);
    all.then(allSuccess);

    function success(data) {
        console.log(data);
        return data + "Chained";
    }

    function allSuccess(){
        console.log("ALL PROMISES RESOLVED")
    }

    one.promise.then(success).then(success);
    two.promise.then(success);
    three.promise.then(success).then(success).then(success);

    $timeout(function () {
        one.resolve("one done");
    }, Math.random() * 1000);

    $timeout(function () {
        two.resolve("two done");
    }, Math.random() * 1000);

    $timeout(function () {
        three.resolve("three done");
    }, Math.random() * 1000);
});
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我设置了一个$q.all()承诺一,二和三,这将在一些随机时间得到解决.然后我将承诺添加到第一和第三的末尾.我想要all解决所有链都已解决的问题.这是我运行此代码时的输出:

one done 
one doneChained …
Run Code Online (Sandbox Code Playgroud)

promise angularjs angular-promise

106
推荐指数
2
解决办法
10万
查看次数

永远不会解决的承诺导致内存泄漏?

我有一个Promise.我创建它以在需要时取消AJAX请求.但是因为我不需要取消那个AJAX,所以我从未解决它并且AJAX成功完成.

一个简化的片段:

var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
    // do something
});

// Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?
Run Code Online (Sandbox Code Playgroud)

永远不会解决这样的承诺导致内存泄漏?您对如何管理Promise生命周期有什么建议吗?

javascript memory-leaks promise angularjs angular-promise

85
推荐指数
1
解决办法
2万
查看次数

angular $ q,如何在for循环内部和之后链接多个promise

我希望有一个for循环,每次迭代都会调用异步函数.

在for循环之后,我想执行另一个代码块,但是在for循环中所有先前的调用都已解决之前.

我现在的问题是,在所有异步调用完成之前执行for循环之后的代码块或者根本不执行它.

带有FOR循环的代码部分和后面的代码块(完整代码,请参见小提琴):

[..]
function outerFunction($q, $scope) {
    var defer = $q.defer();    
    readSome($q,$scope).then(function() {
        var promise = writeSome($q, $scope.testArray[0])
        for (var i=1; i < $scope.testArray.length; i++) {
             promise = promise.then(
                 angular.bind(null, writeSome, $q, $scope.testArray[i])
             );                                  
        } 
        // this must not be called before all calls in for-loop have finished
        promise = promise.then(function() {
            return writeSome($q, "finish").then(function() {
                console.log("resolve");
                // resolving here after everything has been done, yey!
                defer.resolve();
            });   
        });        
    });   

    return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个jsFiddle,可以在这里找到http://jsfiddle.net/riemersebastian/B43u6/3/. …

promise deferred angularjs angular-promise

75
推荐指数
1
解决办法
8万
查看次数

Angular 1.6.0:"可能未处理的拒绝"错误

我们在Angular应用程序中有一个解决承诺的模式,直到Angular 1.6.0为止我们一直很好:

    resource.get().$promise
        .then(function (response) {
        // do something with the response
        }, function (error) {
            // pass the error the the error service
            return errorService.handleError(error);
        });
Run Code Online (Sandbox Code Playgroud)

以下是我们如何在Karma中触发错误:

    resourceMock.get = function () {
        var deferred = $q.defer();
        deferred.reject(error);
        return { $promise: deferred.promise };
    };
Run Code Online (Sandbox Code Playgroud)

现在,随着1.6.0的更新,Angular突然抱怨我们的单元测试(在Karma中)因"可能未处理的拒绝"错误而被拒绝的承诺.但是我们正在处理调用错误服务的第二个函数中的拒绝.

Angular究竟在寻找什么?它是如何让我们"处理"拒绝的?

javascript angularjs karma-runner angular-promise angularjs-1.6

66
推荐指数
6
解决办法
9万
查看次数

AngularJS中的错误处理http get然后构造

当使用AngularJS"http get then"构造(promises)时,如何处理HTTP错误,例如500?

$http.get(url).then(
    function(response) {
        console.log('get',response)
    }
)
Run Code Online (Sandbox Code Playgroud)

问题是,对于任何非200 HTTP响应,都不会调用内部函数.

javascript promise angularjs angular-http angular-promise

65
推荐指数
3
解决办法
10万
查看次数

当一些调用工作而其他调用失败时,$ q.all()会发生什么?

当一些调用工作而其他调用失败时,$ q.all()会发生什么?

我有以下代码:

    var entityIdColumn = $scope.entityType.toLowerCase() + 'Id';
    var requests = $scope.grid.data
      .filter(function (rowData, i) {
          return !angular.equals(rowData, $scope.grid.backup[i]);
      })
      .map(function (rowData, i) {
          var entityId = rowData[entityIdColumn];
          return $http.put('/api/' + $scope.entityType + '/' + entityId, rowData);
      });
    $q.all(requests).then(function (allResponses) {
        //if all the requests succeeded, this will be called, and $q.all will get an
        //array of all their responses.
        console.log(allResponses[0].data);
    }, function (error) {
        //This will be called if $q.all finds any of the requests erroring.
        var abc …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angular-promise

64
推荐指数
4
解决办法
4万
查看次数