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

鍍金池/ 問答/HTML/ 如何用Promise實現(xiàn)一個任務隊列

如何用Promise實現(xiàn)一個任務隊列

工作中遇到一個業(yè)務需求。
實行一個任務隊列,前一個任務執(zhí)行完了以后再去執(zhí)行下一個任務。我本想用promise實行一個異步串行的隊列。但這次情況跟以往不一樣。想了有一段時間想不出來了,求教大佬~

業(yè)務場景抽象出來是:
存在如下任務隊列 T = [A,B]
同時全局下面已經(jīng)存在有一個監(jiān)聽函數(shù) F = onStateChange(res => 'res是我想要判斷的值')
A和B都安上一個run方法(返回promise),該方法會執(zhí)行一段觸發(fā)State改變的邏輯,然后再根據(jù)res的值決定是resolve還是reject

具象出來是:
小程序連接藍牙 需要給藍牙設備發(fā)送好幾條指令 根據(jù)上一條指令是否通過才能進行下一條指令。

回答
編輯回答
哚蕾咪

按你的意思是每個任務的狀態(tài)全是會變成完成的是嗎?
假設你的監(jiān)聽函數(shù)監(jiān)聽的是State這個變量,那么在每個任務結束是判斷下這個變量的值來決定是否退出。

async function t(){
    const T=[A,B];
    for(let i=0;i<T.length;i++){
        await T[i].run();
        // 假設失敗會改成`failed`
        if(State=="failed"){
            console.log("隊列任務失敗");
            break;
        }
    }
}
2017年12月5日 11:35
編輯回答
練命

根據(jù)你的描述,大概模擬了一下、你看是否使用你的場景、最近正好也寫過類似的場景、改了一下

// 任務列表

var T = [];
//全局監(jiān)聽執(zhí)行方法
function onStateChange(){
    //隨機成功失敗
    return Promise.resolve(Math.random() > 0.5) ;
}
// 任務隊列生成方法,生成10個
function taskFactory(){
    for(var i=0;i<10;i++){
        T.push(
            {
                name: i,
                run: function(){
                    var self = this;
                    return new Promise(function(resolve,reject){
                        
                        //觸發(fā)onStateChange ,根據(jù)結果決定是否繼續(xù)執(zhí)行
                        onStateChange().then( function(isResolve){
                            if(isResolve){
                                console.log('成功執(zhí)行任務' + self.name);
                                resolve('成功執(zhí)行任務' + self.name);
                            }else{
                                console.log('執(zhí)行任務失敗,終止任務' + self.name);
                                reject('執(zhí)行任務失敗,終止任務' + self.name);
                            }
                        })
                    })
                }
            }
        )
    }
}

// 生成任務隊列內容
taskFactory();

//隊列序號
var index = 0;

//執(zhí)行任務隊列方法
function doTask(){
    if(index == T.length-1){
        return Promise.resolve('任務列表執(zhí)行完畢');
    }
    return new Promise(function(resolve,reject){
        T[index].run().then(function(result){
            index ++;
            resolve(doTask());
        }).catch(function(failresult){
            resolve(failresult);
        });
    });
}

// 執(zhí)行任務隊列
doTask().then(function(result){
    console.log("result:" + result);
});

2018年6月27日 02:37