我正在发出一系列 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 承诺链的问题。假设我在承诺链的某个地方有一个行动。该操作不会返回任何值,但必须在链继续之前完成。
我需要将这个行动包含在一个承诺中吗?我需要这样的东西吗:
$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)
有人可以建议吗?
我在$ 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) 我对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(),承诺被拒绝并且控制被移动到随后的块的错误函数.
任何帮助是极大的赞赏.提前致谢.
以下方法工作:
$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)如何使以下功能取决于之前的结果?
我是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) 我在这里遇到角度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) 我无法理解角度分量范围。如果我做类似的事情:
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 和其他异步操作,它不起作用。
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 作为键的数组,以及从异步函数获取的值
我需要进行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吗?
对此还不太清楚
angular-promise ×10
angularjs ×9
javascript ×7
promise ×3
unit-testing ×2
angular ×1
es6-promise ×1
ionic2 ×1
jasmine ×1
timeout ×1
undefined ×1