Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .
nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data
:
function synchronousCode() {
var getURL = function(url) {
return window.fetch(url).data.text().data;
};
var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
console.log('received bytes:',getURL(url).length);
};
nsynjs.run(synchronousCode,{},function(){
console.log('synchronousCode done');
});
Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):
var ajaxGet = function (ctx,url) {
var res = {};
var ex;
$.ajax(url)
.done(function (data) {
res.data = data;
})
.fail(function(e) {
ex = e;
})
.always(function() {
ctx.resume(ex);
});
return res;
};
ajaxGet.nsynjsHasCallback = true;
Шаг 2. Вставить синхронную логику в функцию:
function process() {
console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}
Шаг 3. Выполнить функцию синхронно через nnsynjs:
nsynjs.run(process,this,function () {
console.log("synchronous function finished");
});
Nsynjs будет оценивать все операторы и выражения шаг за шагом, приостанавливая выполнение в случае, если результат некоторой медленной функции не готов.
Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples
Существует ли решение этого действительно зависит от вашей разметки.
Поскольку селекторы в основном статичны и не имеют переменных, нет способа использовать селектор для соответствия любому элементу с определенным значением атрибута на основе другого элемента (или его отсутствия) с тем же значением атрибута, не зная заранее. Если возможные значения для этого атрибута не могут быть определены, то нет чистого решения CSS.
Если для этого атрибута существует только конечный набор значений, и вы знали эти значения заранее, вы могли бы написать селектор для каждого возможного значения, но вам нужно будет жестко кодировать каждое из этих значений. Такой селектор будет построен с использованием псевдокласса :not()
в сочетании с смежным комбинатором сиблов +
, методом, который я использовал здесь здесь :
li:not([attribute_name='a']) + li[attribute_name='a'],
li:not([attribute_name='b']) + li[attribute_name='b']
Как вы можете сказать, если у вас много разных возможных значений, ваш селектор будет расти очень быстро. Но это единственный реальный способ сделать это, используя чистый CSS, и даже тогда он все еще требует знания возможных значений заранее.
Я думаю, что это можно сделать, используя селектор nth-child ():
p:nth-child(2)
{
background:#ff0000;
}