2014-04-04 3 views
2

약속을 처음 접했고 올바르게 사용하는지 잘 모르겠습니다. 몇 가지 약속으로 계산을하려고하므로 여러 기능을 함께 묶었습니다. 처음에 나는 다음과 같이 작성했다. 그러나 효과가있는 코드는 좋은 코드처럼 보이지 않는다. 어떻게 연쇄 함수에서 반환 된 약속을 참조합니까?

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

,하지만 난 promCells 될 findElements의 결과를 얻기 위해 노력하고있어. 또한 getText() 함수의 결과를 참조하고 싶습니다. 이 문제에 다르게 접근해야하는지 알려주세요. 감사! JS에서

나는이처럼 쓰기에 대해 생각했다 ...

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); 
    }); 
}); 
+0

'getAggCellColumn'과'getText'가 비동기인가요? – Bergi

답변

1

약속의 개념은 오류 처리와, 기능 체인입니다. 귀하의 경우에는 체인 연결만으로도 충분합니다.

전화를 연결하려면 기능을 전달해야하며,이 값은 체인의 다음 기능에서 사용할 값을 반환 할 수 있습니다.

단위 테스트에서 it은 체인이 끝나는 시점을 알아야하므로 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); 
}); 

참고 :

당신은 마지막으로 뭔가를 할 것이다. 어쨌든 나는 약속의 개념을 이해하도록 노력하고 있습니다!

+0

고마워요. 정말 도움이되었고, 지금은 더 잘 이해하고 있습니다. – Brendan

+1

@Brendan은 문제를 해결 한 경우 답변을 수락하는 것을 고려합니다. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

관련 문제