【问题标题】:Promises and concurrency承诺和并发
【发布时间】:2015-07-19 00:57:37
【问题描述】:

我要再次问这个问题,因为我上次没有想到正确的问题。

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

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

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

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

我想使用 Promises 来规范所有这些点击。这就像设置一连串鞭炮,然后点燃第一个……但 Promise 会立即执行。我该怎么做?

我可以用普通的旧 JS 编写代码,但我想学习其他方法。我想是涉及allmap 的东西。

【问题讨论】:

  • 迭代对象属性,不保证顺序(实际上 - 没有顺序) - 所以你现在有其他问题。还有一件事。提供演示。你的第二段不清楚
  • 给定的对象只是我将迭代的数组中对象的一个​​示例。很抱歉造成混乱
  • 超时时间是多久?是否保证在某个超时后构建菜单?如果您有某种可以收听的事件会向您指示菜单何时准备好再次单击,那就更好了。
  • 菜单的检查与基本问题无关——我一直在用 100 毫秒——因为菜单 dom 的实际使用直到很久以后才会发生。我只需要它存在,并且第一次单击可确保,第二次单击似乎在构建后被缓存。

标签: javascript jquery promise


【解决方案1】:

如您所见:

图片来源:MDN

你可以使用onFulfillment回调在promise完成后做你需要的工作。

【讨论】:

    【解决方案2】:

    这是我想出的。打败一头三足驴。

    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) 的 Bluebird 等价物。

    【讨论】:

    • 顺便说一句,如果您使用的是 Bluebird,您应该使用 Promise.delay 而不是自己的 setTimeout
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2017-09-21
    • 2022-12-07
    • 2023-03-26
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多