zoukankan      html  css  js  c++  java
  • Promise的串行,并行,并发

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>promise test</title>
    </head>
    <body>
        <script>
             Promise.serial = function(promiseGens,allowFail){
                let seq = Promise.resolve();
                promiseGens.forEach(function(item){
                    seq = allowFail ? seq.then(item).catch(err => err) : seq.then(item);
                });
    
                return seq;
            }
    
            //单个promise reject后,继续执行
            Promise.parallel = function(promiseGens){
                let allPromise = new Promise(function(resolve,reject){
                    let results = [];
                    promiseGens.forEach(function(item){
                        item()
                        .then(data => results.push(data))
                        .catch(err => results.push(err))
                        .finally(function(){
                            if(results.length == promiseGens.length){
                                resolve(results);
                            }
                        })
                    });
                });
    
                return allPromise;
            }
    
            Promise.concurrency = function(promiseGens,concurrency,allowFail){
                let promiseGenCopys = [].concat(promiseGens);
                let concurrencyPromises = [];
                let res = [];
                while(concurrency--){
                    concurrencyPromises.push(recur(promiseGenCopys));
                }
                
                return Promise.all(concurrencyPromises).then(_ => res);
    
                // return Promise.parallel(concurrencyPromises);
    
                function recur(promiseGens){
                    if(!promiseGens.length) return Promise.resolve();
    
                    let first = promiseGens.shift();
                    return first().then(function(data){
                        res.push(data);
                        return recur(promiseGens);
                    }).catch(function(err){
                        res.push(err);
                        return allowFail ? recur(promiseGens) : err; 
                    })
                }
            }
        </script>
        <script>
            // 异步函数a
            var a = function () {
                return new Promise(function (resolve, reject) {
                    setTimeout(function () {
                        console.log('resolve a');
                        resolve('a');
                    }, 500)
                })
            }
    
            // 异步函数b
            var b = function (data) {
                return new Promise(function (resolve, reject) {
                    setTimeout(() => {  
                        console.log('reject b',data);
                        reject(data||'reject'+ 'b');
                    },500)
                })
            }
    
            // 异步函数c
            var c = function (data) {
                return new Promise(function (resolve, reject) {
                    setTimeout(function () {
                        console.log('resolve c',data);
                        resolve(data||'reject' + 'c');
                    }, 500)
                })
            }
    
            // 异步函数c
            var d = function (data) {
                return new Promise(function (resolve, reject) {
                    setTimeout(function () {
                        console.log('resolve d',data);
                        resolve(data||'reject' + 'd');
                    }, 500)
                })
            }
    
            // 异步函数c
            var e = function (data) {
                return new Promise(function (resolve, reject) {
                    setTimeout(function () {
                        console.log('reject e',data);
                        reject(data||'reject' + 'e');
                    }, 500)
                })
            }
    
            // 异步函数c
            var f = function (data) {
                return new Promise(function (resolve, reject) {
                    setTimeout(function () {
                        console.log('reject f',data);
                        reject(data||'reject' + 'f');
                    }, 500)
                })
            }
    
            //串行测试
            // Promise.serial([a,b,c,d,e,f],true).then(function(data){
            //     console.log(data);
            // }).catch(function(err){
            //     console.log('catch',err);
            // });
    
            //并行测试
            // Promise.parallel([a,b,c,d,e,f]).then(function(data){
            //     console.log(data);
            // }).catch(function(err){
            //     console.log(err);
            // });
    
            //并发测试
            Promise.concurrency([a,b,c,d,e,f],2,true).then(function(data){
                console.log(data);
            }).catch(function(err){
                console.log(err);
            })
        </script>
    </body>
    </html>
  • 相关阅读:
    “键鼠耕耘,IT家园”,博客园2010T恤正式发布
    解决jQuery冲突问题
    上周热点回顾(5.316.6)
    博客园电子期刊2010年5月刊发布啦
    上周热点回顾(6.76.13)
    Chrome/5.0.375.70 处理 <pre></pre> 的 Bug
    [转]C# MemoryStream和BinaryFormatter
    [转]Android adb不是内部或外部命令 问题解决
    [转]HttpWebRequest解析 作用 介绍
    财富中文网 2010年世界500强排行榜(企业名单)
  • 原文地址:https://www.cnblogs.com/mengff/p/12864797.html
Copyright © 2011-2022 走看看