gpt4 book ai didi

javascript - 将一系列函数覆盖为 Promise

转载 作者:行者123 更新时间:2023-11-29 23:00:51 25 4
gpt4 key购买 nike

我有一个网页,其中包含一个加载数据的表单和一组不同的模块,具体取决于检索到的数据。我有一个绑定(bind)到表单的 onSubmit 事件。加载的一些模块添加了一个函数,该函数将 Promise 返回到 submitHooks 数组。当用户提交表单时,它会执行数组中的所有这些函数,并继续做它的事情。例如:

// 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 并只执行它。否则,执行一切。问题是必须修改所有现有模块,我希望我不必触及任何现有模块。

最佳答案

我在考虑 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
});
}
}

关于javascript - 将一系列函数覆盖为 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com