2015-05-08 33 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