http.get при вызове изнутри функции не возвращает ответ - PullRequest
0 голосов
/ 08 января 2019

У меня есть вызов функции, которая inturn вызывает 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 Ответ

0 голосов
/ 08 января 2019

Две вещи:

1) Вероятно, вам следует обрабатывать отказ при оформлении запроса. Таким образом, в вашем блоке catch после вызова http.get вы должны reject(err).

2) Причина, по которой вы не получаете ответ, заключается в том, что вы его не ждете. Вы просматриваете набор данных и отправляете запросы, а затем ваш код просто продолжает работать. Что вы хотите сделать, это дождаться завершения всех запросов, а затем сделать что-то. Вот пример использования функции all() из библиотеки es6 Promise.

 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);
    })
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...