AngularJS:如何使用Angular承诺

AngularJS : How to work with Angular Promises

本文关键字:Angular 承诺 何使用 AngularJS      更新时间:2023-09-26

我有一个函数,它调用rest服务,我想用它从返回的数据填充一个数组。Angular返回一个Promise,我不知道如何使用Promise中的数据来填充数组。

我的函数:

    $scope.save= function(){
    var duplicateNames= [];
    for(var i=0; i < ids.length; i++){
        var id= "bns-" + i;
        var aName= document.getElementById(id).value;
        var responsePromise= $http.get("/rest/v1/names/" + aName + "/");
        responsePromise.success(function(data, status, headers, config) {
            if(data.name.length > 0)
                duplicateNames.push(data.name);
        });
    }
    console.log(duplicateNames);

rest调用返回数据,如果"aName"存在,那么我想在数组中跟踪它。我如何"暂停"执行,使数组"duplicateNames"将有"aName"添加到它?

你不能暂停执行,承诺的全部意义在于它异步执行。也就是说,在处理http请求时,代码继续执行。一旦http请求返回结果,就会调用success函数。在这个示例中,console.log语句在responsePromise.success函数之前执行。如果将日志语句移动到success函数中,您将看到预期的结果。

在您的示例中,duplicatNames数组不是当前$作用域的模型,因此它的值有限,正如您已经发现的那样—当函数退出时数组的值不是您感兴趣的值。但是,如果您通过将数组附加到控制器的$scope使其成为模型,则可以使用双向绑定或$watch语句对更新后的值执行操作。

基本上,你需要开始异步思考,并理解HTTP请求另一端的处理可能会花费你需要考虑的时间。有很多关于学习angular承诺的资源,这里有4:

  • https://docs.angularjs.org/api/ng/service/美元q
  • AngularJS:在哪里使用承诺?
  • http://lostechies.com/gabrielschenker/2014/02/04/angularjspart-11-promises/
  • http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/