鍍金池/ 問(wèn)答/HTML/ promise的流程的實(shí)現(xiàn)

promise的流程的實(shí)現(xiàn)

我有一個(gè)函數(shù),里面new了三個(gè)promise,然后我需要怎么調(diào)用這個(gè)函數(shù)才能實(shí)現(xiàn)將這里面的三個(gè)promise一個(gè)一個(gè)的進(jìn)行。
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.....

大概是這個(gè)意思。。。。

回答
編輯回答
青黛色

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

2017年6月20日 23:12
編輯回答
喵小咪

Promise.all

2017年7月31日 17:04
編輯回答
硬扛

Promise.all是并行的關(guān)系,雖然是都成功,但沒(méi)有規(guī)定非要按照順序執(zhí)行。

http://liubin.org/promises-bo... 這個(gè)文檔有詳細(xì)的介紹

2017年2月22日 19:55
編輯回答
有點(diǎn)壞

promise.all是并行的,里面所有完成或第一個(gè)失敗才結(jié)束。你想要一個(gè)一個(gè)來(lái)就鏈?zhǔn)芥溄?then(fun1).then(fun2)...

2017年3月3日 00:50
編輯回答
萢萢糖

主要的思想還是得在上一個(gè)promise狀態(tài)發(fā)生改變后,才去執(zhí)行下一個(gè)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()
    })
}
2017年2月17日 18:14
編輯回答
赱丅呿

我知道我理解的對(duì)不對(duì): 你有幾個(gè)方法, 執(zhí)行之后會(huì)返回promise, 你希望這幾個(gè)promise一個(gè)接一個(gè)執(zhí)行,有點(diǎn)類似fun1().then(fun2).then(fun3);

如果你用過(guò) bluebird ,它有一個(gè)promise.map 應(yīng)該可以滿足你的要求;

如果不想用 bluebird, 可以定義一個(gè)簡(jiǎn)單的 Promise 隊(duì)列

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);

其實(shí)如果你能用 async/await 就更簡(jiǎn)單了:

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)
2018年1月8日 20:27