在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

大概是這個意思。。。。

回答
編輯回答
青黛色

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

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

Promise.all

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

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

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

2017年2月22日 19:55
編輯回答
有點壞

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

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

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

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

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

如果不想用 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)
2018年1月8日 20:27