2015-05-08 71 views
0

我會再次提出這個問題,因爲我上次沒有正確的問題。Promises and concurrency

假設我有jQuery選擇的集合中的數組:

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

我想通過這些選擇進行迭代,如果menu不存在,那麼如果click存在,然後單擊...

這是麻煩開始的地方。我需要點擊一次,然後在再次點擊之前進行超時 - 這允許菜單由另一個腳本構建,而第二次點擊將隱藏它。

我想用Promise來規範所有這些點擊。這就像建立一連串的鞭炮,然後照亮第一個......但諾言立即執行。我該怎麼做呢?

我可以在普通的老式JS中編寫代碼,但我想學習其他方法。一些涉及allmap,我想。

+0

迭代對象屬性,不保證順序(事實上 - 沒有順序) - 所以你現在有其他問題。還有一件事。提供演示。你的第二段不清楚 –

+0

給定的對象只是我將迭代的數組中的對象的一個​​例子。對不起,我感到困惑 –

+0

超時時間有多長?菜單是否保證在特定超時後建立?如果你有某種你可以聽到的事件會更好,當菜單準備好再次點擊時它會指示你。 –

回答

0

正如你可以在這裏看到:

enter image description here

圖片來源:MDN

您可以使用onFulfillment回調的承諾得到滿足後,做你的工作neccessary。

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

這是藍鳥,如果那件事。我不知道藍鳥相當於$.when(1)

+0

'$ .when'的藍鳥等價物是'Promise.resolve'。 – Bergi

+1

順便說一句,如果你使用藍鳥,你應該使用'Promise.delay'而不是自己的'setTimeout' – Bergi