дождаться окончания вложенных обещаний с несколькими запросами - PullRequest
0 голосов
/ 05 июня 2018

В самом цикле для итерации по массиву, этот массив более конкретно представляет собой список объектов, каждый из которых содержит массив с кодами, которые мне нужно использовать для получения некоторой информации, предоставляемой внешнимAPI (Ради простоты я использую объекты-макеты):

data = [{resultOfRequest, [code1, code2, code3]}, {resultOfRequest, [code4, code5, code6]},...}

Мне нужно обойти массив данных, сделать один запрос на codeX и сохранить результат в resultOfRequest.

в последовательной парадигме, это будет примерно так:

for all items in data as work: 
     for all items in work as codeArray:
            for all codes in codeArray as code:
                   work.result = request(to-api, code) //waiting here for termination

Я начал с javascript пару дней, и я прочитал, что он должен быть неблокирующим, но для этой конкретной задачи я должен сделать его синхронным и ждатьпока все объекты не будут проверены.

Моя попытка включает в себя обещания и выглядит следующим образом:

//here the map iterates over the data array
// work = {resultOfRequest, [code1,code2,code3] }

  Promise.all(data.map((work, index) => {
             orclass.elserec(work, 0).then((results) => {
                    console.log(results);
             });
  }))
  .then(results => {
      console.log("finished")
  });

И так как мне нужно завершить рекурсивные вызовы, когда он достигает индекса 3, я должен сделатьэто в тобратный вызов:

 // here i try to iterate through the codeX arrays, and making requests 
//(where work =  {resultOfRequest,  [code1, code2, code3]})

  elserec: function(work, i){

    return request('api-url-code= work.array[i]', function(error, response, body) {
        result = JSON.stringify(JSON.parse(body));
        if (!error && response.statusCode == 200 && i !== 3) {
            console.log(result);
            work.resultOfRequest.push(result);
            return orclass.elserec(work, i+1);
        } else {            
            return result;
        }
    });
  }

Он застревает при 3-м запросе данных [0].

Я бы предпочел использовать только обратные вызовы для этого, просто чтобы понять, какони работают так, как я никогда не использовал javascript, скорее предпочли бы использовать то, что было раньше, чем обещания, чтобы узнать ( В этом более конкретном контексте обратные вызовы в простом асинхронном контексте не являются чем-то особенным я знаю)!

1 Ответ

0 голосов
/ 05 июня 2018

Я нашел способ сделать эту работу.

рекурсивные вызовы не были хорошей идеей, поэтому вместо этого я сопоставил функцию (с обещанием запроса) массивом с кодами ([code1, code2, code3]) и в итоге получил [elrec (code1)), elrec (code2), elrec (code3)].После этого я вызываю обещание. Все с обещаниями в массиве.это работает:

Promise.all(data.map((works, index) => {
    return Promise.all(works.map((work, index) => {
             var promises = work.scopus.map(function(obj){
                return orclass.elrec(work,obj).then(function(results){
                   console.log("working!!!!!!");
                })
              })
             return Promise.all(promises);
    }))
})).then(function(){ //all api calls are done, proceed here})

функция elrec:

elrec: function(work, code) {
    return request('https://api.*****' + code + '*****',
        function(error, response, body) {

            if (!error && response.statusCode == 200) {
                result = JSON.stringify(JSON.parse(body));
                work.elsev.push(result);
            } else if (response.statusCode == 404) {
                work.elsev.push("failed req");
            }
        });
}

Как я хотел, я могу ждать, пока все обещания будут "выполнены" (все запросы API выполнены, для всех кодов) и принять меры после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...