簡體   English   中英

將函數數組覆蓋為 Promise

[英]Override an array of functions as Promise

我有一個網頁,其中包含一個加載數據的表單和一組不同的模塊,具體取決於檢索到的數據。 我有一個與表單相關的onSubmit事件。 一些加載的模塊添加了一個函數,該函數將一個 Promise 返回到一個submitHooks數組。 當用戶提交表單時,它會執行 Array 中的所有這些函數,並繼續做它的事情。 例如:

// submitHooks array
var submitHooks = [];

// a module loader passes in the array, and the module adds on to it. For example...
// ...
function doSomething() {
    return new Promise(function(res){
        return setTimeout(function(){ return res('something'); }, 700);
    });
}
submitHooks.push(doSomething);
// ...

// On submit...
function onSubmit() {
    Promise.all(submitHooks.map(function(sh){ return sh(); }))
        .then(function(results){
            // finish up
        })
        .catch(function(err){
            // handle error
        });
}

但是,根據場景,可能會加載一個“覆蓋”模塊,該模塊添加到submitHooks數組中,並希望阻止執行該數組中的所有其他內容。

問題:我將如何做到這一點? 如果該submitHooks數組中存在“覆蓋”函數,我如何防止該數組中的所有其他函數被執行?

我試圖做的是清除submitHooks數組,但它只有在最后加載“覆蓋”模塊時才有效。 如果在它之后加載了其他模塊,這些模塊仍然會執行。

function overrideAllOthers() {
    return new Promise(function(res){
     // ...
    });
}
submitHooks.length = 0;
submitHooks.push(overrideAllOthers);
// this doesn't work

我能想到的另一種方法是讓模塊返回這樣的對象:

submitHooks.push({
    override: false,
    doSomething: function() { }
});

然后在onSubmit ,檢查任何override並僅執行該override 否則,執行一切。 問題是必須修改所有現有模塊,我希望我不必接觸任何現有模塊。

我在考慮 Jim 的回答,但我需要一個來自覆蓋模塊的標記作為指標。 然后我意識到:“等等,Javascript的函數一個對象!” 最后,我只能修改覆蓋模塊和提交事件:

// overriding module

function overrideAllOthers() {
    return new Promise(function(res){
     // ...
    });
}
overrideAllOthers.override = true;
submitHooks.push(overrideAllOthers);
// ...

// event
function onSubmit() {
    var overrideHook = submitHooks.find(function(sh){ return sh.override; });
    if(overrideHook) {
        overrideHook();
    } else {
        Promise.all(submitHooks.map(function(sh){ return sh(); }))
            .then(function(results){
                // finish up
            })
            .catch(function(err){
                // handle error
            });
    }
}

首先檢查數組中的函數。 就像是:

function onSubmit() {
    if(OVERRIDE_FUNCTION_EXISTS_IN_SUBMITHOOKS) { 
        return new Promise(() => OVERRIDE_FUNCTION()})
    else { 
        Promise.all(submitHooks.map(function(sh){ return sh(); }))
            .then(function(results){
                // finish up
            })
            .catch(function(err){
                // handle error
            });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM