【问题标题】:How do I reference a promise returned from a chained function? [duplicate]如何引用从链式函数返回的承诺? [复制]
【发布时间】:2014-05-16 21:18:27
【问题描述】:

我是 Promise 的新手,我不确定我是否正确使用它们。我正在尝试用一些承诺进行计算,所以我将一堆函数链接在一起。首先,我像下面这样编写它,它有效,但似乎不是好的代码。

it('should verify CPC column', function() {
  ptor.findElements(protractor.By.className('aggRow')).then(function(promCells) {
    getAggCellColumn('CPC').then(function(promColCPC) {
      getAggCellColumn('Spend').then(function(promColSpend) {
        getAggCellColumn('Clicks').then(function(promColClicks) {
          promCells[promColCPC].getText().then(function(promStringCPC) {
            promCells[promColSpend].getText().then(function(promStringSpend) {
              promCells[promColClicks].getText().then(function(promStringClicks) {
                var floatCPC = parseFloat(promStringCPC);
                var floatSpend = parseFloat(promStringSpend);
                var floatClicks = parseFloat(promStringClicks);
                var result = Math.round((floatSpend / floatClicks) * 100) / 100;
                expect(floatCPC).toEqual(result);
              });
            });
          });
        });
      });
    });
  });
});

我对 Promise 进行了更多研究并得出以下结论:

it('should verify CPC column', function() {
  ptor.findElements(protractor.By.className('aggRow'))
    .then(getAggCellColumn('CPC')) 
    .then(getAggCellColumn('Spend')) 
    .then(getAggCellColumn('Clicks')) 
    .then(promCells[promColCPC + 2].getText()) 
    .then(promCells[promColSpend + 2].getText()) 
    .then(promCells[promColClicks + 2].getText()) 
    .then(function(promStringClicks) {
      var floatCPC = parseFloat(promStringCPC);
      var floatSpend = parseFloat(promStringSpend);
      var floatClicks = parseFloat(promStringClicks);
      var result = Math.round((floatSpend / floatClicks) * 100) / 100;
      expect(floatCPC).toEqual(result);
    });
});

这不起作用,但我试图让 findElements 的结果成为 promCells。我还想参考 getText() 函数的结果。请让我知道我是否应该以不同的方式处理这个问题。谢谢!

我也想过这样写……

it('should verify CPC column', function() {
  ptor.findElements(protractor.By.className('aggRow'))
    .then(function(promStringClicks) {
      var floatCPC = parseFloat(promCells[getAggCellColumn('CPC') + 2].getText());
      var floatSpend = parseFloat(promCells[getAggCellColumn('Spend') + 2].getText());
      var floatClicks = parseFloat(promCells[getAggCellColumn('Clicks') + 2].getText());
      var result = Math.round((floatSpend / floatClicks) * 100) / 100;
      expect(floatCPC).toEqual(result);
  });
});

【问题讨论】:

  • getAggCellColumngetText 是否异步?

标签: javascript angularjs asynchronous promise protractor


【解决方案1】:

JS 中的 Promises 概念是函数链,带有错误处理。在您的情况下,您可以只使用链接。

因此,为了链接您的调用,您必须传递 函数,它可以返回一些值以供链中的下一个函数使用。

请注意,在单元测试中,its 必须知道您的链何时结束,因此您可以期待 done 函数并在您的链结束时调用它。

你最终会得到类似的东西:

it('should verify CPC column', function(done) {
    var promStringCPC, promStringSpend, promStringClicks;
    ptor.findElements(protractor.By.className('aggRow'))
        .then(function (promCells) {
            // Do something from async result like the following...
            promStringCPC = promCells.getAggCellColumn('CPC');
            promStringSpend = promCells.getAggCellColumn('Spend');
            promStringClicks = promCells.getAggCellColumn('Clicks');

            var floatCPC = parseFloat(promStringCPC);
            var floatSpend = parseFloat(promStringSpend);
            var floatClicks = parseFloat(promStringClicks);
            var result = Math.round((floatSpend / floatClicks) * 100) / 100;
            expect(floatCPC).toEqual(result);

            // You can do async additional stuff here...
            // return asyncResultOrNestedPromise
        }) 
        .then(function (result) {
            // ... and use the async's result here
        })
        .then(done);
});

请注意,我没有清楚地了解您的具体情况。无论如何,我试图让你理解 Promise 的概念!

【讨论】:

猜你喜欢
  • 2016-12-24
  • 2017-09-16
  • 2017-11-27
  • 1970-01-01
  • 2017-04-05
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多