标签: angular-promise

如何存储带有以任意顺序返回的 Promise 的 for 循环的计数?

我正在发出一系列 http 请求,当它们返回时,我需要将结果归档到列表对象中。我正在使用角度承诺。

因为 Promise 只会在 for 循环完成后解析,所以它们都会被归档到列表的最后一个索引中。

for (var i = 0;i < list.length; i+=1) {
    Promise.do(action).then(function(result) {
        list[i] //i is always at last index because the for loop has already completed
    }
}
Run Code Online (Sandbox Code Playgroud)

javascript promise angularjs angular-promise

5
推荐指数
1
解决办法
5141
查看次数

承诺链接和处理不返回承诺链中任何内容的操作

我有一个关于 Javascript 承诺链的问题。假设我在承诺链的某个地方有一个行动。该操作不会返回任何值,但必须在链继续之前完成。

我需要将这个行动包含在一个承诺中吗?我需要这样的东西吗:

$q.when();
Run Code Online (Sandbox Code Playgroud)

请参阅下面我的代码:

...
var goToDashboard = function () {
    //TODO: use $q here?
    $state.go('dashboard');
};
...
activateEmail().then(signinByToken).then(setPersonalInfo).then(goToDashboard).then(somethingElse).catch(reportProblem);
Run Code Online (Sandbox Code Playgroud)

有人可以建议吗?

angularjs angular-promise

5
推荐指数
1
解决办法
824
查看次数

$ timeout.flush TypeError:无法读取未定义的属性'$$ nextSibling'

我在$ timeout内有一段代码,执行了一个Promise。当我为此编写单元测试时,我使用$ timeout.flush()并且可以进入$ timeout块。然后解决了promise(因为$ timeout在内部调用了$ scope。$ apply()),但是在方法代码完成并冒出茉莉花之后,我得到了错误TypeError:无法读取未定义的属性'$$ nextSibling'。其他人曾经经历过吗?

控制器代码:

$scope.timeoutFunction = function(){
    $timeout(function () {
        $scope.callFunction().then(function () {
            callAnotherFunction();
        });
    }, 0);
}
Run Code Online (Sandbox Code Playgroud)

单元测试代码:

$scope.timeoutFunction();

scope.$digest(); // not needed

$timeout.flush(); // even tried $timeout.flush(0);
Run Code Online (Sandbox Code Playgroud)

另外,如果我模拟超时是一个回调函数,它的工作原理。例:

function mockedTimeout() {
    arguments[0]();
}

$timeout = mockedTimeout;
Run Code Online (Sandbox Code Playgroud)

然后,我们只使用$ scope。$ digest来调用promise,超时立即运行。可能是尖角虫吗?

完整的错误堆栈:

TypeError: Cannot read property '$$nextSibling' of undefined
at n.$get.n.$digest (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\Libs\Angular\angular.min.js:124:101)
at n.$get.n.$apply (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\Libs\Angular\angular.min.js:126:293)
at Object.fn (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\Libs\Angular\angular.min.js:139:3)
at Function.angular.mock.$Browser.self.defer.flush (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\TDD\angular-mocks.js:127:42)
at Function.angular.mock.$TimeoutDecorator.$delegate.flush (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\TDD\angular-mocks.js:1732:28)
at null.<anonymous> (http://localhost:51679/Tests.js:254:18)
at jasmine.Block.execute (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\jasmine.js:1064:17)
at jasmine.Queue.next_ (http://localhost:51679/referenceFile?path=D:\development\Projects\WebSite\Scripts\jasmine.js:2096:31)
at jasmine.Queue.start …
Run Code Online (Sandbox Code Playgroud)

unit-testing timeout angularjs angular-promise

5
推荐指数
0
解决办法
741
查看次数

AngularJS deferred.reject不起作用,但$ q.reject工作

我对Angular JS deferred和$ q感到困惑.我发现这个SO问题解释了$q.defer()和之间的区别.$q解释说

$ q.reject是创建延迟的快捷方式,然后立即拒绝它

所以$q.reject()必须等于

var deferred = $q.defer(); deferred.reject()如果没有请解释两者之间的实际差异.

但在我的情况下,$q.reject()是工作,但deffered.reject()不工作.我们也需要退回被拒绝的承诺,$q.reject()但不是deferred.reject().我看过没有回报的例子deffered.reject()

这是代码

 var deferred = $q.defer();
 myService.getData()
 .then(function(response){
   deferred.notify('Just a notification');
   deferred.reject('rejected');
 })
 .then(function(response) {
   console.log('done');      
 }, function(response) {
   console.log('rejected');
 })
Run Code Online (Sandbox Code Playgroud)

这不起作用,但是当我替换deferred.reject$q.reject(),承诺被拒绝并且控制被移动到随后的块的错误函数.

任何帮助是极大的赞赏.提前致谢.

javascript angularjs angular-promise

5
推荐指数
1
解决办法
6915
查看次数

带有`$ q`的角度执行顺序 - 链接承诺

以下方法工作:

$q.when()
        .then(checkCookieToken)         // check if cookie already exists e.g. in cookie
        .then(setHeader)                // set Header with REST-Token e.g from cookie
        .then(checkTokenOnline)         // if not OK logout
        .then(getMenu)                  // if previous OK get navigation menu
        .then(getDataResource)          // set ngResource
        .then(getData);                 // and query it
Run Code Online (Sandbox Code Playgroud)

4个问题:

1)如果eg checkTokenOnline不正常,我不想执行其余的功能,我怎么能退出(退出,中断,等等......)?

2)如何设置其中一些并行,其中一些是串行的?

3)如何在它们之间传输数据?

4)如何使以下功能取决于之前的结果?

angularjs angular-promise

5
推荐指数
1
解决办法
1008
查看次数

Angular服务的Jasmine测试不能解决延迟呼叫

我是Angular的新手,我正在测试一个运行API级别服务的Angular服务,该服务将大量调用包装到REST服务中.因为它正在处理HTTP请求,所以服务的两个部分都在使用promises,它似乎工作正常,但我无法对承诺的行为进行任何测试.

我的服务代码的相关部分(非常简化)如下所示:

angular.module('my.info')
 .service('myInfoService', function (infoApi, $q) {
    infoLoaded: false,
    allInfo: [],
    getInfo: function () {
        var defer = $q.defer();
        if (infoLoaded) {
            defer.resolve(allInfo);
        } else {
            infoApi.getAllInfo().then(function (newInfo) {
                allInfo = newInfo;
                infoLoaded = true;
                defer.resolve(allInfo);
            });
        }
        return defer.promise;
    }
});
Run Code Online (Sandbox Code Playgroud)

当我设置我的模拟时,我有这样的事情:

   describe("Info Service ",
     function() {
        var infoService, infoRequestApi, $q;
        beforeEach(module("my.info"));
        beforeEach(function() {
            module(function($provide) {
                infoRequestApi = {
                   requestCount: 0,
                   getAllInfo: function() {
                       var defer = $q.defer(); 
                       this.requestCount++;
                       defer.resolve( [ "info 1", "info 2" ] );
                       return …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing jasmine angularjs angular-promise

5
推荐指数
1
解决办法
468
查看次数

如何使用返回http Promise的Angular 2服务

我在这里遇到角度2的麻烦。我使用返回承诺的服务,但是当我尝试检索响应时出现错误。

我读过这个问题, 这是我的代码。

这是HotelService.ts

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';

//rxjs promises cause angular http return observable natively.
import 'rxjs/add/operator/toPromise';

@Injectable()
export class HotelService {

    private BASEURL : any = 'http://localhost:8080/hotel/';

    constructor(private http: Http) {}  

    load(): Promise<any> {
        return this.http.get(this.BASEURL + 'api/client/hotel/load')
            .toPromise()
            .then(response => {
                response.json();
                //console.log(response.json());
            })
            .catch(err => err);
    }
}
Run Code Online (Sandbox Code Playgroud)

此Hotel.ts(组件)

import { Component, OnInit } from '@angular/core';
import { NavController } from 'ionic-angular';

import { HotelService } from …
Run Code Online (Sandbox Code Playgroud)

javascript undefined angular-promise ionic2 angular

5
推荐指数
1
解决办法
4783
查看次数

ES6 Promise 不更新 AngularJS DOM

我无法理解角度分量范围。如果我做类似的事情:

function myComponent(){
  this.data = 'Hello World';
}

let myModule = angular.module('myModule', []);

myModule.component('myComponent', {
  template: `<div>{{$ctrl.data}}</div>`,
  controller: myComponent
});
Run Code Online (Sandbox Code Playgroud)
    <script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>
<div ng-app="myModule">
  <my-component></my-component>
</div>
Run Code Online (Sandbox Code Playgroud)

它打印得很好......现在,如果我做一个小的修改并使其异步:

function myComponent(){
  Promise.resolve().then(_ => {
    this.data = 'Hello World';
  });
}

let myModule = angular.module('myModule', []);

myModule.component('myComponent', {
  template: `<div>{{$ctrl.data}}</div>`,
  controller: myComponent
});
Run Code Online (Sandbox Code Playgroud)
<script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>
<div ng-app="myModule">
  <my-component></my-component>
</div>
Run Code Online (Sandbox Code Playgroud)

它不打印任何东西。我可以使用点击处理程序更改该值,但对于 http 和其他异步操作,它不起作用。

javascript angularjs es6-promise angular-promise

5
推荐指数
2
解决办法
1686
查看次数

forEach 内的承诺返回

function getNamesById(nameIds) {
    var defer = $q.defer();

    var result = [];
    nameIds.forEach(function (nameId) {
        account.getNameById(nameId).then(function (name) {
            result[nameId] = name;
        });
    });
    defer.resolve(result);
    return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)

我上面的代码显然没有按预期工作。我必须迭代一个 id 数组并构造另一个以 id 作为键的数组,以及从异步函数获取的值

javascript promise angularjs angular-promise

5
推荐指数
1
解决办法
2709
查看次数

返回一个承诺,如果找到一个值,则将其解析为布尔值true或false

我需要进行api调用,以返回ID和与其关联的值的响应。然后,promise解析并返回true或false(如果找到或未找到查询的id)。

我怎样才能做到这一点?使用诺言的新手。正如诺言似乎令人困惑

这是使用API​​的终点,UserService返回ID和薪水的数组。我需要检查ID是否存在以及薪水是否与查询匹配,然后Promise需要解析为true或false。

这是身份证和收入的对象

      [{
            "id": 1,
            "name": "Primary",
            "sal": [{
                    "id": "1",
                    "sal": "10"
                }, {
                    "id": "2",
                    "sal": "20"
                }]
            },{
            "id": 2,
            "name": "Secondary",
            "sal": [{
                    "id": "1",
                    "sal": "100"
                }, {
                    "id": "2",
                    "sal": "200"
                }
            ]
        }];


  UserService.hasUserValue(id, income).then(function(qualifiesforlowIncome){
     var isLowIncome = qualifiesforlowIncome
   }
Run Code Online (Sandbox Code Playgroud)

qualifyforlowIncome是返回true或false的布尔值。我正在使用角度,因此在这种情况下我应该执行$ q.defer并返回defer.promise吗?

对此还不太清楚

javascript promise angularjs angular-promise

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