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>
  • 相关阅读:
    loaded some nib but the view outlet was not set
    指标评比
    IOS DEVELOP FOR DUMMIES
    软件测试题二
    javascript select
    DOM节点类型详解
    mysql操作
    UVA 10055
    solutions for 'No Suitable Driver Found For Jdbc'
    解决git中文乱码问题
  • 原文地址:https://www.cnblogs.com/mengff/p/12864797.html
Copyright © 2011-2022 走看看