Skip to content

promise管理

对pormise函数进行一些额外的操作来实现一些逻辑。

定义promise数组

定义一个数组,数组里面都是方法,方法返回一个promise

js
const interval = 100;
const setPromiseArray = (num) => {
    return Array(num).fill(0).map((val, index) => {
        return () => new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(index)
            }, interval * Math.random())
        })
    })
}
const promiseArr = setPromiseArray(100);

如何让多个promise方法并行

js
Promise.all(promiseArr.map(v => v())).then(res => {
    console.log(res)
})

如何让多个promise方法串行

js
promiseArr.reduce((pre, cur) => {
    return pre.then(res => {
        console.log(res)
        return cur();
    })
}, Promise.resolve(-1)).then(res => {
    console.log("last index is " + res)
})

如何设计一个窗口

窗口大小是一个正整数,最多只允许窗口大小的promise并行;

js
const promisePipe = (promiseArr, windowLen) => {
    if (promiseArr.length <= windowLen) {
        Promise.all(promiseArr.map(v => v())).then(res => {
            console.log(res)
        })
        return
    }
    function run(fn) {
        fn().then(res => {
            console.log(res)
            if (promiseArr.length) run(promiseArr.shift())
        })
    }
    for (let i = 0; i < windowLen; i++) {
        run(promiseArr[i])
    }
}
promisePipe(promiseArr, 10)

设计一个wrap方法

wrap方法,传入一个promise,函数正常执行的时候返回这个promise的结果,同时随时可以abort promise

js
const wrap = (promise) => {
    let _reject;
    const obj = Promise.race([promise, new Promise((resolve, reject) => {
        _reject = reject
    })])
    obj.abort = () => {
        _reject("abort");
    }
    return obj
}
const myPromise = new Promise((resovle, reject) => {
    setTimeout(() => {
        resovle("done")
    }, 2000)
})
const myWrap = wrap(myPromise);
myWrap.then(res => {
    console.log('resolve', res)
}, res => {
    console.log('reject', res)
}).catch(e => {
    console.log('catch', e)
})
setTimeout(() => {
    myWrap.abort();
}, 1000)
结果
js
// reject abort
// 如果去掉, res => {
//    console.log('reject', res)
//}
// 结果就是 catch abort

注意:

这里的pormise虽然看起来好像直接放弃了那个函数,但实际上他已经执行完了,看例子:

js
const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log(1)
        resolve('Promise 1 resolved');
    }, 1500);
});

const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log(2)
        resolve('Promise 2 resolved');
    }, 500);
});

const promise3 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log(3)
        reject(new Error('Promise 3 rejected'));
    }, 1000);
});

Promise.race([promise1, promise2, promise3])
    .then((value) => {
        console.log('Resolved:', value);
    })
    .catch((error) => {
        console.error('Rejected:', error.message);
});
结果
js
// 2
// Resolved: Promise 2 resolved
// 1
// 3

sleep函数

js
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

鄂ICP备2024055897号