我正在使用jsonapi-serializer库来反序列化API数据。我使用angular的$ q构造函数进行回调并将其包装在服务中,这在浏览器上工作正常,但是当我在karma运行器上使用jasmine测试它时,promise无法解决。这是服务上的方法(注意我使用的是TypeScript)
id
经过一段时间的尝试调试后,这是我的测试
public deserialize(type: string, data: any): any {
// get the predefined options for resource type
let deserializeOpts: any = this.deserializeOpts[type];
// use jsonapi-serializer
// the options are not working
let deserializer: any = new JAS.Deserializer({});
console.log(data);
// return a promise with the parsed object
return this._$q((resolve: any, reject: any) => {
deserializer.deserialize(data, (err: any, result: any) => {
if (result) {
console.log(resolve);
resolve(result);
} else {
console.log(err);
reject(err);
}
});
});
}
这是对所述解串器服务的示例用法
it('should flatten jsonapi user', function (done) {
var deserialized;
JsonapiParser.deserialize(type, apiUser).then(
(result) => {
deserialized = result;
expect(deserialized).toEqual(apiUser);
done();
}
);
});
最后一段代码在浏览器上编译和运行时工作正常。但测试得到了超时。如果我在// returns the promise so controller can display the errors
return this.$http.get(url)
.then(
(response: any) => {
if (response.data.data.length !== 0) {// deserialize data
return this._deserializer.deserialize('activities', response.data) // the deserializer service is called;
} else { // throw an error if data is empty
return this.$q.reject({ error: this.ACTIVITY.empty });
}
},
() => {
return this.$q.reject({ error: this.ACTIVITY.connectionError });
}
).then(
(deserialized: any) => { // data is copied to original list so it doesn't lose it's bindings
angular.copy(deserialized, this.list); // the result from the deserializer is used
console.log(deserialized);
return this.list;
});
方法中登录,我可以看到回调得到解决,但承诺似乎永远不会消化。如果我在解析调用之后放置$ rootScope。$ digest(),测试工作,但我不想在那里硬编码,特别是因为代码在部署时工作。
答案 0 :(得分:2)
您与$rootScope.$digest()
关系密切,但不是从应用代码触发摘要,而是使用$rootScope.$apply()
从测试中触发摘要。
答案 1 :(得分:0)
这在浏览器上运行正常
我无法相信。你永远不会打电话给resolve
!而不是
console.log(resolve);
你需要使用
console.log(result);
resolve(result);
顺便说一下,典型的node-style callback promisification使用的是if (err)
,而不是if (result)
。也许你想要if (err || !result)
。