在服务调用后聚合对象属性值时,我似乎遇到了一些不一致的行为。
function(someService) {
var object = {
property: 50
};
someService.getObject("parameter").then(function(data) {
//Check value before aggregation
console.log(object.property);
console.log(data.property);
object.property += data.property;
//Check value after aggregation
console.log(object.property);
});
};
假设data.property
的值始终为50
,则代码执行后object.property
的值在每次加载页面时都不一致:
测试1:
在:
object.property = 50
,data.property = 50
后:
object.property = 50
测试2:
在:
object.property = 50
,data.property = 50
后:
object.property = 100
测试3:
在:
object.property = 50
,data.property = 50
后:
object.property = 100
测试4:
在:
object.property = 50
,data.property = 50
后:
object.property = 50
是否有更好的方法来汇总这些值,以便每次都能保持结果一致?
答案 0 :(得分:0)
因为我看到您的代码中有then()
与Promise相关的函数Promise then()我假设您的getObject()
是异步调用。之所以会得到不同的结果是因为你的console.log或者有时在异步函数getObject()
之前执行的任何事情都是完整的,有时甚至是AFTER。这就是为什么你得到不一致的结果。为了解决这个问题,您需要了解异步调用以及如何处理它们。更重要的是,您需要在异步功能完成后检查测试中object
的值。
让我猜你是否使用这个console.log:
someService.getObject("parameter").then(function(data) {
object.property += data.property;
console.log(object.property); // always gives you result 100 you expect
});
它会始终显示正确的值100
。
要将您的功能转换为正确的异步,您可以执行以下操作:
function myFunc(someService) {
return new Promise(function(resolve, reject) {
var object = {
property: 50
};
someService
.getObject("parameter")
.then(function(data) {
object.property += data.property;
resolve(object);
})
.catch(reject);
});
});
};
// somewhere in your tests
myFunc(someService)
.then(function(object) {
// do my tests here
expect(object.property).to.equal(someValue);
});