如何正确聚合JS对象属性

时间:2016-07-19 15:59:22

标签: javascript angularjs ajax asynchronous

在服务调用后聚合对象属性值时,我似乎遇到了一些不一致的行为。

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 = 50data.property = 50 后: object.property = 50

测试2:

在: object.property = 50data.property = 50 后: object.property = 100

测试3:

在: object.property = 50data.property = 50 后: object.property = 100

测试4:

在: object.property = 50data.property = 50 后: object.property = 50

是否有更好的方法来汇总这些值,以便每次都能保持结果一致?

1 个答案:

答案 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);
  });