promise的流程的实现

发布于 2022-09-06 21:24:16 字数 312 浏览 10 评论 0

我有一个函数,里面new了三个promise,然后我需要怎么调用这个函数才能实现将这里面的三个promise一个一个的进行。
function ALL(arr){
function fun1{
var promise1=new promise;
}
function fun2{
var promise2=new promise;
}
function fun3{
var promise3=new promise;
}

}
all([fun1,fun2,fun3]).then.....

大概是这个意思。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

笑脸一如从前 2022-09-13 21:24:16

我知道我理解的对不对: 你有几个方法, 执行之后会返回promise, 你希望这几个promise一个接一个执行,有点类似fun1().then(fun2).then(fun3);

如果你用过 bluebird ,它有一个promise.map 应该可以满足你的要求;

如果不想用 bluebird, 可以定义一个简单的 Promise 队列

function queue(arr){
    var _ok,_no;
    var values=[];
    var _arr = arr.slice(0);
    function run(){
        if(!_arr.length){
            return _ok(values);
        }
        var job = _arr.shift();
        Promise.resolve(typeof job == 'function'?job():job).then(v=>{
            values.push(v);
            run();
        },_no)

    }
    return new Promise(function(ok,no){
        _ok = ok;
        _no = no;
        run();
    });
}

使用方法如下:


function fn1(){
    return new Promise(function(res,rej){
        setTimeout(function(){
            console.log('fn1');
            res('fn1')
        },500,'fn1')
    })
}

function fn2(){
    return new Promise(function(res,rej){
        console.log('fn2');
        res('fn2')
    })
}

var arr = [
    fn1,
    fn2
]

queue(arr).then(console.log);

其实如果你能用 async/await 就更简单了:

async function run(arr){
    let values = [];
    for(let i=0; i<arr.length; i++){
        values.push(await arr[i]());
    }
    return values;
}
run(arr).then(console.log)
心病无药医 2022-09-13 21:24:16

Promise.all是并行的关系,虽然是都成功,但没有规定非要按照顺序执行。

http://liubin.org/promises-bo... 这个文档有详细的介绍

羁〃客ぐ 2022-09-13 21:24:16

主要的思想还是得在上一个promise状态发生改变后,才去执行下一个promise:

let pArr = [p1, p2, p3]
let iterator = pArr[Symbol.iterator]()
let val = new Array(pArr.length)

const runNext = () => {
    let promise
    for (let next = iterator.next(); !next.done; next = iterator.next()) {
        let value = next.value
        promise = value
        break;
    }
    
    if (!promise) {
        return Promise.resolve(val)
    }
    
    return promise.then((value) => {
        val.push(value)
        return runNext()
    })
}
北城挽邺 2022-09-13 21:24:16

promise.all是并行的,里面所有完成或第一个失败才结束。你想要一个一个来就链式链接,then(fun1).then(fun2)...

冷了相思 2022-09-13 21:24:16

Promise.all

怀念你的温柔 2022-09-13 21:24:16

fun1 里面 return fun2() , fun2 里面 return fun3()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文