我调用了该函数,该函数又调用了 http.get 。当直接调用搜索方法时,我正确地得到结果,但是当我通过循环调用所有 getAll 方法时。我得到空或未定义的结果
function search(url, node, notFound) {
return new Promise(function(resolve, reject) {
http.get(url).then(function(data){
var val = 1;
for (var i = 0; i < data.length; i++) {
$searchModal.find(node).append(`<div class="col-xs-12"><label> ${label} ${val}</label></div>`);
var val = val + 1;
for (key in data[i]) {
var index = 1;
if (key == "Udfs") {
$searchModal.find(node).append(`<div class="col-xs-12"><label> ${key} </label></div>`);
for (udfKey in data[i][key]) {
$searchModal.find(node).append(`<div class="col-lg-3" ><div class="input-group"> <span class="input-group-addon" id="key">${udfKey}</span> <input id="accountModelId" type="text" disabled class="form-control" placeholder="" aria-describedby="accountModel" value="${data[i][key][udfKey]}"></div></div>`);
}
}
for (var j = 0; (Array.isArray(data[i][key])) && j < data[i][key].length; j++) {
$searchModal.find(node).append(`<div class="col-xs-12"><label> ${key} ${index}</label></div>`);
var index = index + 1;
for (objKey in data[i][key][j]) {
$searchModal.find(node).append(`<div class="col-lg-3" ><div class="input-group"> <span class="input-group-addon" id="key">${objKey}</span> <input id="accountModelId" type="text" disabled class="form-control" placeholder="" aria-describedby="accountModel" value="${data[i][key][j][objKey]}"></div></div>`);
}
}
if (!Array.isArray(data[i][key]) && !(data[i][key] instanceof Object)) {
$searchModal.find(node).append(`<div class="col-lg-3" ><div class="input-group"> <span class="input-group-addon" id="key">${key}</span> <input id="accountModelId" type="text" disabled class="form-control" placeholder="" aria-describedby="accountModel" value="${data[i][key]}"></div></div>`);
}
}
}
console.log(data);
resolve(data.toString());
if (data.length == 0) {
$searchModal.find(node).append(notFound);
}
}).catch(function err() {
$searchModal.show("modal")
$searchModal.find(node).append(notFound);
});
});
}
function getAll() {
urls = [contactUrl, accountUrl, assestUrl]
nodes = ['#contactData', '#accountData', '#assetData']
list = [$noContacts, $noAccounts, $noAsset]
for (let i = 0; i < urls.length; i++) {
search(urls[i], nodes[i], list[i]);
}
}
需要帮助来处理这个问题。谢谢
最佳答案
有两件事:
1) 您应该在提出请求时处理拒绝的情况。因此,在调用 http.get
之后的 catch block 中,您应该 reject(err)
。
2) 您没有收到回复的原因是您没有等待回复。您正在循环访问数据集并发送请求,然后您的代码就会继续运行。您要做的就是等待所有请求完成,然后执行某些操作。以下是使用 es6 Promise
库中的 all()
函数的示例。
function getAll() {
urls = [contactUrl, accountUrl, assestUrl]
nodes = ['#contactData', '#accountData', '#assetData']
list = [$noContacts, $noAccounts, $noAsset]
var promiseArray = [];
for (let i = 0; i < urls.length; i++) {
promiseArray.push(search(urls[i], nodes[i], list[i]));
}
Promise.all(promiseArray)
.then((resp) => {
console.log(resp[0]); // response from 1st request
console.log(resp[1]); // response from 2nd request
}).catch((err) => {
console.log(err);
})
}
关于javascript - 从函数内调用 http.get 时不返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54082041/