[英]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.