javascript - 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 很陌生,我无法指出问题所在,所以即使这是一个愚蠢的错误,也请在这里帮助我。
解决方案
您是否尝试过使用“const”而不是“const”。'promises' 常量可能没有定义。
推荐阅读
- windows - windows下编译gtk+3.0:找不到staticpixbufloader-gdiplus
- c# - C#方法第二个参数可选
- javascript - 缩短一条线。80 个字符限制
- c# - C# ViewModel 对象创建
- java - 具体:Java中的卡片布局
- flask - FlaskForm 无法提交数据
- android-studio - adb devices 列出了我的手机,但 android studio 没有显示这个
- java - Java 8 流 - 修改组中的所有元素
- selenium - 如何在 C# 中使用 VS 中的 Selenium webdriver 中的相对 Xpath
- java - 如何修复 500 Bad Request 错误?[java,安卓]