Javascript 如何引用从链式函数返回的承诺?
我对承诺不熟悉,我不确定我是否正确地使用了它们。我试图用一些承诺进行计算,所以我把一系列函数链接在一起。首先,我像下面那样编写了它,这很有效,但似乎不是好代码Javascript 如何引用从链式函数返回的承诺?,javascript,angularjs,asynchronous,promise,protractor,Javascript,Angularjs,Asynchronous,Promise,Protractor,我对承诺不熟悉,我不确定我是否正确地使用了它们。我试图用一些承诺进行计算,所以我把一系列函数链接在一起。首先,我像下面那样编写了它,这很有效,但似乎不是好代码 it('should verify CPC column', function() { ptor.findElements(protractor.By.className('aggRow')).then(function(promCells) { getAggCellColumn('CPC').then(function(pr
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);
});
});
});
});
});
});
});
});
我进一步研究了一些承诺,并得出以下结论:
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的结果。我还想引用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);
});
});
JS中的概念是带有错误处理的函数链接。在你的情况下,你可以只使用锁链 因此,为了链接调用,必须传递函数,这些函数可以返回一些值供链的下一个函数使用 请注意,在单元测试中,
it
s必须知道链何时结束,因此您可以期待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);
});
请注意,我没有清楚地了解你的具体情况。无论如何,我想让你明白承诺的概念非常感谢布兰登,这真的很有帮助,我现在理解得更好了。“那么,如果你解决了你的问题,请考虑接受他的回答,看看是<代码> GigAgCysLabe<代码>和<代码> GETTEX/<代码>异步还是不?