Я бы переместил асинхронную логику в вызов it
. Привыкание с модульными тестами - это запах кода и, вероятно, просто раздражает других разработчиков, когда им нужно не только отлаживать и исправлять неудачные тесты, но и отлаживать и исправлять тесты, которые даже не определены и не выполняются, потому что у причудливого кода установки есть ошибки , Старайтесь не ходить туда.
var assert = require('assert')
var Promise = require('bluebird')
/* global describe, it*/
var fn = function(value) {
return value + ' ' + 'pancake'
}
function getTests() {
return Promise.resolve('kitty pancake')
.delay(500)
.then(function(value) {
return [
{
'arg': 'kitty',
'expect': value
},
{
'arg': 'doggy',
'expect': 'doggy pancake'
}
]
})
}
describe('example', function() {
it('should handle many things', function(done) {
getTests().then(function(tests) {
tests.forEach(function(test) {
var value = fn(test.arg)
assert.equal(value, test.expect, 'should return ' + test.expect)
})
done()
})
})
})
Существенно - нет. Это почти так легко, как это добирается. Вы могли бы переписать его немного более короткий/более чистый, но идея будет тем же. Это - то, как я записал бы его:
$c = true; // Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
Если Вы хотите сделать это на дисплее, заканчиваются и довольны или иначе уже использование JavaScript, библиотеки как jQuery будут часто иметь : нечетный и : даже селекторы, которые можно тогда сцепить до добавления конкретного свойства стиля или сцепление в CSS в более общем плане добавляющие классы .
Использование чего-то вроде этого:
<?php
function cycle(&$arr) {
$arr[] = array_shift($arr);
return end($arr);
}
$oddEven = array('odd', 'even');
echo cycle($oddEven)."\n";
echo cycle($oddEven)."\n";
echo cycle($oddEven)."\n";
Только для забавы
Принятие можно использовать селекторы CSS3, можно сделать что-то как
<div class="posts">
<? foreach($posts as $post){?>
<div>
<?=$post?>
</div>
<? }?>
</div>
<style>
div.posts div:odd{background-color:red;}
</style>
Даже с поддержкой CSS2 и mootools (библиотека JavaScript), можно заменить стилем с этим javascript
<script type="text/javascript">
// obviously this script line should go in a js file in a onload (or onDomReady) function
$('div.posts div:odd').setStyle('background-color','red');
</script>
, Если у Вас ничего нет кроме php этим, можно упростить немного Ваш код с помощью массива
<? $isodd=array('','odd');
$c=0;
foreach($posts as $post){?>
<div class="<?=$isodd[$c++%2]?>">
<?=$post?>
</div>
<? }?>
На стороне noe, для чередования между двумя значениями и b хороший способ сделать его в цикле является этим:
x = a;
while ( true ) {
x = a + b - x;
}
можно также сделать это без дополнения и вычитания:
x = a ^ b ^ x;
, где ^ является операцией "исключающее ИЛИ".
, Если Вы просто хотите чередоваться между 0 и 1, можно сделать это:
x = 0;
while ( true ) {
x = !x;
}
Вы могли, конечно, использовать x как индекс цветов, классы стиля CSS и так далее.
Можно инкапсулировать логику следующим образом:
<?php
class ListCycler {
private $cols, $offs, $len;
// expects two or more string parameters
public function __construct() {
$this->offs = -1;
$this->len = func_num_args();
$this->cols = func_get_args();
foreach($this->cols as &$c)
$c = trim(strval($c));
}
// the object auto-increments every time it is read
public function __toString() {
$this->offs = ($this->offs+1) % $this->len;
return $this->cols[ $this->offs ];
}
}
?>
<html>
<head>
<style>
ul#posts li.odd { background-color:red; }
ul#posts li.even { background-color:white; }
</style>
</head>
<body>
<div>
<h3>Posts:</h3>
<ul id="posts"><?php
$rc = new ListCycler('odd','even');
foreach($posts as $p)
echo "<li class='$rc'>$p</li>";
?></ul>
</div>
</body>
</html>
У присяжного острослова есть он встроенный:
{section name=rows loop=$data}
<tr class="{cycle values="odd,even"}">
<td>{$data[rows]}</td>
</tr>
{/section}
Так делает Django:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
Если требуется иметь меньше встроенного PHP, отличный способ выполнения, это через JavaScript.
Используя jQuery, это просто:
<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
Используя CSS3 можно сделать что-то вроде этого:
div:nth-child(odd)
{
background-color: red
}
, Но лучше не используют это в течение нескольких лет, если Вы на самом деле хотите, чтобы Ваши пользователи видели цвет...
Возможно, функция со статической переменной?
<?php
function alternate_row_color($css_class) {
static $show = true;
$show = !$show;
if ($show) {
return $css_class;
} else {
return NULL;
}
}
?>
Затем для использования его (использование примера):
<?php foreach($posts as $post) { ?>
<div class="<?=alternate_row_color('odd')?>">
<?=$post?>
</div>
<?php } ?>
<?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?>
<div<?php echo $alt ? ' class="odd"' : ''; ?>>
<!-- Content -->
</div>
<?php endforeach ?>
был бы самый простой и самый ясный способ сделать это.
я всегда называю свои строки зебры "row0" и "row1" - это делает код немного более простым.
<?php // you should always use the full opening tag for compatibility
$i = 0;
foreach ($rows as $row) {
echo '<tr class="row' . ($i++ % 2) . '">...</tr>';
}
?>
Это достаточно коротко, как это, но я, вероятно, перенесся бы, это в некоторого помощника функционирует с ясным именем. Тем путем более очевидно, что продолжается, и Вы не должны будете повторять, что логика во всех шаблонах, где Вам нужен он.
function row_color($cnt,$even,$odd) {
echo ($cnt%2) ? "<tr bgcolor=\"$odd\">" : "<tr bgcolor=\"$even\">";
}
Как использовать:
$cnt=0;
while ($row = mysql_fetch_array ($result)) {
row_color($cnt++,"e0e0e0","FFFFFF");
}