javascript - Javascript Promise 未按正确顺序执行
问题描述
我有个问题。我正在尝试执行以下操作:
我首先检查包含agentId
参数的 url。然后我想检查我的数据库,如果给定的agentId
属于一个有效的代理。如果是这样,那么我想将该代理的整个对象存储在一个名为selectedAgent
. 然后我想selectedAgent
在接下来的 2 个函数中使用 。
问题是它给了我错误:Uncaught TypeError: Cannot read property 'active' of null
在第 106 行。这是由于链中的最后一个函数在其余函数之前执行。这是代码:
const urlString = window.location.search;
const urlParams = new URLSearchParams(urlString);
let selectedAgentId = urlParams.get('agentId');
let selectedAgent = null;
document.addEventListener('DOMContentLoaded', function(event) {
getStartupAgentData().then(fillAgentComboBox()).then(setToggleButtonContent());
});
function getStartupAgentData() {
return new Promise(function(resolve, reject) {
$.ajax({
type: 'POST',
url: 'overview_get_agent_ajax.php',
data: 'agentid=' + selectedAgentId,
dataType: 'text',
success: function(data) {
selectedAgent = JSON.parse(data)[0];
console.log(selectedAgent);
resolve(true);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log("Failed receiving agents")
reject(true);
}
});
});
}
function fillAgentComboBox() {
console.log(selectedAgent);
return new Promise(function(resolve, reject) {
getAllAgentData().then(function(agents) {
let comboBoxAgent = document.getElementById("comboBoxAgent");
for (let i = 0; i < agents.length; i++) {
let option = document.createElement("option");
// Agent data
let id = agents[i].id;
let owner = agents[i].owner;
let exchange = agents[i].exchange;
let remark = agents[i].remark;
let text = "Agent " + id.toString().padStart(4, "0") + " - " + owner + " - " + exchange + " - " + remark;
option.text = text;
option.value = id;
comboBoxAgent.add(option);
if (selectedAgent === null) {
option.selected = true;
selectedAgent = agents[i];
}
else if (id === selectedAgentId) {
option.selected = true;
selectedAgent = agents[i];
}
}
// Add agent id to url for other javascripts
window.history.replaceState(null, null, "?agentId=" + selectedAgent.id);
resolve(true);
});
});
}
function getAllAgentData() {
return new Promise(function(resolve, reject) {
$.ajax({
type: 'POST',
url: 'overview_get_agents_ajax.php',
data: '',
dataType: 'text',
success: function(data) {
resolve(JSON.parse(data));
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
reject(true);
}
});
});
}
function setToggleButtonContent() {
let btnToggleAgent = document.getElementById("btnToggleAgent");
if (selectedAgent.active == true) {
btnToggleAgent.style.background = "#EE4141";
btnToggleAgent.innerHTML = "Stop";
}
else {
btnToggleAgent.style.background = "#44B642";
btnToggleAgent.innerHTML = "Start";
}
}
我怎样才能解决这个问题?
解决方案
你想要then(fillAgentComboBox)
没有()
which 调用你的函数并立即启动它。你也可以做then(() => fillAgentComboBox())
推荐阅读
- javascript - 为什么在对焦前模糊火焰以及解决方案是什么
- python - 向神经元添加特征
- c# - 将数据库代码移动到单独的程序集时将连接字符串放在哪里
- java - java - 如何从Java中的电报机器人获取用户的输入?
- go - Golang 错误 - 未声明的名称:xxx 编译器
- python - Python烧瓶API POST请求-键后的JSON数据
- active-directory - 通过 Active Directory 登录时使用的用户名
- javascript - 如何声明一个始终为空的 Typescript 数组?
- git - git clone 获取在特定标签后添加/修改的文件
- c# - 尝试构建具有多个 where 条件的 linq 查询