以Promise

时间:2019-04-17 18:10:24

标签: javascript

我有一个网页,其中包含一个加载数据的表单和一组取决于检索到的数据的不同模块。我有一个与表单相关的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数组,但是只有在最后一次加载“ override”模块时它才起作用。如果之后还加载了其他模块,则这些模块仍将执行。

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并仅执行。否则,执行所有操作。与此相关的问题是必须修改所有现有模块,而我希望不必接触任何现有模块。

2 个答案:

答案 0 :(得分:1)

我正在考虑Jim的答案,但是我需要覆盖模块中的标记作为指标。然后我意识到:“等等,JavaScript 中的函数是一个对象!”最后,我只能修改覆盖模块和Submit事件:

// 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
            });
    }
}

答案 1 :(得分:0)

首先检查数组中的函数。像这样:

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
            });
}