首页 > 解决方案 > Javascript:循环中的所有承诺都没有得到解决,这使得执行挂起/停止

问题描述

我有一个特定的情况,我正在循环多个工件并基于一组规则(在 JSON 中)我必须评估它们中的每一个,因为检查每个规则的调用是异步的,我使用 promise.all 来在评估所有规则后执行一些最后步骤。

下面的代码用于根据一个工件的规则类型评估规则。

Const promises=[];    
var ruleTest = function (artifact) {
        main.totalLength++;
        var config = RuleEngine.RuleConfigurations;
        // fetching rules and iterating through each of them to call has_attribute function or contains function based on the Type in the JSON config
        for (let i = 0; i < config.length; i++) {
            console.log(config[i]);

            switch (config[i].Rule.Type) {
                case "has_Attribute":
                    has_Attribute(artifact, config[i]);
                    break;
                case "contains":
                    contains(artifact, config[i]);
                    break;
            }
        }

        Promise.all(promises).then(values => {
            console.log(values);
            console.log(main.contentList)
            // some final steps after all the promise are resolved
            main.loading = false;
            main.displayInfo = true;
            main.showInfo = true;
            //issuesFlag=false;
        })

}

function has_Attribute(artifact, rule) {
    var attributes = rule.Rule.MandatoryAttributes.split(',');
    for (let i = 0; i < attributes.length; i++) {
        attributes[i] = attributes[i].trim();
    }

        promises.push(hasAttributePromise(artifact, rule, attributes));
}

var hasAttributePromise = function (artifact, rule, attributes) {
    return new Promise((resolve, reject) => {
        // some async stuff
        resolve(value);
        }
    }

function contains(artifact, rule) {
    //some business logic
    promises.push(containsPromise(artifact, rule, blackListWords, whiteListWords))
}

var containsPromise = function (artifact, rule, blackListWords, whiteListWords) {
    return new Promise((resolve) => {
        //some async stuff
        resolve(value);
    }
}

我面临的问题是即使有两个规则(每种类型之一)脚本甚至在调用第二个承诺之前就退出并且页面似乎卡住了 promise.all 从未被调用。我必须为多个规则实现这一点,并且将根据规则类型多次创建相同的承诺。

奇怪的是,如果我使用变量名创建承诺而不是从函数中返回它,并且我通过 promise.all 中的变量名调用它,它会为每次调用工作一次然后退出。例如:

    var ruleTest = function (artifact) {
    main.totalLength++;
    RuleEngine.RuleConfigurations.forEach(function (rule) {
        console.log(rule)
        switch (rule.Rule.Type) {
            case "has_Attribute":
                has_Attribute(artifact, rule);
                break;
            case "contains":
                contains(artifact, rule);
                break;
        }
    })

    Promise.all([hasAttributePromise, containsPromise]).then(values => {
        console.log(values);
        console.log(main.contentList)
        if (issuesFlag){
            main.updatedLength++;
        }
        main.loading = false;
        main.displayInfo = true;
        main.showInfo = true;
        issuesFlag=false;
    })
}

  function has_Attribute(artifact, rule) {
    var attributes = rule.Rule.MandatoryAttributes.split(',');
    for(var i=0; i<attributes.length; i++){
        attributes[i]=attributes[i].trim();
    }

    hasAttributePromise = new Promise((resolve, reject) => {
        asyncCall(()=>{
            //business logic
            resolve();
        })
    });
}

我也尝试过使用 forEach 而不是 for 循环,但它没有帮助。

我对 Javascript 很陌生,我无法指出问题所在,所以即使这是一个愚蠢的错误,也请在这里帮助我。

标签: javascriptloopsasynchronouspromise

解决方案


您是否尝试过使用“const”而不是“const”。'promises' 常量可能没有定义。


推荐阅读