2015-05-08 6 views
0

Я снова задам этот вопрос, потому что в последний раз у меня не было правильной проблемы.Обещания и параллелизм

Предположим, у меня есть коллекция JQuery селекторы в массиве:

[{menu:'.menu-a',click:'.menu-a-click'},...] 

Я хочу перебирать этих селекторов, и если menu не существует, то, если click существует, то нажмите ...

Здесь начинается проблема. Мне нужно щелкнуть один раз, затем выполнить тайм-аут, прежде чем снова щелкнуть - что позволяет создавать меню другим сценарием, а второй щелчок скроет его.

Я хочу использовать Promises для регулирования всего этого щелчка. Это было бы похоже на создание цепочки фейерверков, а затем освещение первого ... но обещания сразу выполняются. Как мне это сделать?

Я могу закодировать его в простой старой JS, но я хочу изучить другие методы. Что-то с участием all или map, я полагаю.

+0

Итерирующее свойство объекта, не гарантирует порядок (на самом деле - нет заказа) - так что у вас есть другая проблема сейчас. еще кое-что. поставьте демоверсию. ваш второй абзац не ясен –

+0

Данный объект является всего лишь примером объектов в массиве, который я буду перебирать. Извините за недоразумение –

+0

Сколько времени занимает таймаут? Возможно ли, что меню будет создано после определенного таймаута? Было бы намного лучше, если бы у вас было какое-то событие, которое вы могли бы прослушать, что указывало бы вам, когда меню будет готово к другому щелчку. –

ответ

0

Как вы можете увидеть здесь:

enter image description here

источника изображения: MDN

Вы можете использовать onFulfillment обратный вызов, чтобы сделать свою работу после того, как необходимое обещание выполнено.

1

Вот что я придумал. Бьет трехногий осел.

var menus=[{id:0},{id:1},{id:2},{id:3}]; 

function doer(menu){ 
    return new Promise(function called(res,rej){ 
     console.log('click1:'+menu.id); 
     setTimeout(function(){ 
     if(menu.id===2){return rej(new Error('could not'));} 
     console.log('click2:'+menu.id); 
     res(1);// happy 
     },Math.random()*8000); 
    }); 
} 

Promise.reduce(menus,function(ctr,cur,i){ 
    return doer(menus[i]).then(function(res,rej){ 
    console.log('happy:',res); 
    }); 
},$.when(1)).then(function(){ 
    console.log('everyones done'); //no errors 
}).catch(function(eee){ 
    console.log('Error:',eee); 
}).finally(function(){ 
    console.log('finally'); 
}); 

Это Bluebird, если это имеет значение. Я не знаю эквивалент Bluebird $.when(1).

+0

эквивалент «$ .when» Bluebird «Promise.resolve». – Bergi

+1

Кстати, если вы используете Bluebird, вы должны пойти с 'Promise.delay' вместо того, чтобы делать свой собственный' setTimeout' – Bergi

Смежные вопросы