承诺和并发

时间:2015-05-08 07:30:48

标签: javascript jquery promise

我将再次提出这个问题,因为我最后一次没有考虑到正确的问题。

假设我在数组中有一组jQuery选择器:

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

我想迭代这些选择器,如果menu不存在,那么如果click存在,则点击...

这就是麻烦开始的地方。我需要单击一次,然后再次单击之前执行超时 - 这允许菜单由另一个脚本构建,第二次单击将隐藏它。

我想使用Promises来规范所有这些点击。这就像建立一连串的鞭炮,然后照亮第一个......但Promise马上执行。我该怎么做?

我可以用普通的旧JS编写代码,但我想学习其他方法。我认为涉及allmap的内容。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

正如你在这里看到的那样:

enter image description here

图片来源:MDN

在履行承诺后,您可以使用onFulfillment回调来完成必要的工作。