javascript node.js async-await электрон - PullRequest
0 голосов
/ 06 февраля 2019

Я не могу найти подходящее решение этой проблемы.

Я пытаюсь использовать цикл foreach для вызова данных.Я пробовал несколько вариантов упаковки этого в обещаниях, но не могу остановить эту функцию от продолжения до завершения цикла.Надеясь, что кто-то может иметь некоторую проницательность.

    async function getData(){
    temparray [] = { data to iterate over };

    await getAgents();
    console.log('done');

    function getAgents(){
    return new Promise(resolve => {
            temparray.forEach((deal) => { 
                 pipedrive.Persons.get(deal.agent, function(err, person) {
                    if (err) throw err;
                    console.log("trying to get agent " + deal.agent)
                    console.log(person.name);
                 });
            });
        }); // end of promise
    }; 
};

Итак, я пытаюсь создать обещание, которое разрешается после завершения всех асинхронных вызовов, но процесс запускается до завершения.Следовательно, «done» регистрирует консоль до того, как функция getAgents () завершила и зарегистрировала имена.Я подозреваю, что это связано с обратными вызовами, но я попытался преобразовать его в обещание, я попытался использовать util.promiseify, и я смотрел на создание массива обещаний, а затем с использованием обещания. Но непроверил это.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

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

  1. Создать счетчик, который отслеживает, сколько асинхронных запросов выполнено
  2. Увеличить счетчик в функции обратного вызова асинхронного запроса
  3. Добавитьпроверить, равен ли счетчик длине массива
  4. Разрешить обещание, если счетчик равен длине входного массива
const fs = require('fs');

async function getData() {
  const array = [1, 2, 3, 4, 5, 6];

  // Create a counter that tracks how many async requests are completed
  let counter = 0; 

  await getAgents();
  console.log('done');

  async function getAgents() {
    return new Promise(resolve => {
      array.forEach((item, i) => {
        //do async stuff here
        fs.writeFile(`${i}.file.txt`, `line in file ${i}`, err => {
          if (err) throw err;

          // Increment the counter in the callback function of async request
          // Add check if counter is equal to length of array
          if (++counter == array.length) {
            // Resolve the promise once the counter is equal to the length of input array
            resolve(counter);
          }
        });
      });
    });
  }
}

getData();
0 голосов
/ 06 февраля 2019

Вот как вы должны поступить с другим примером

exec = async () => {
  let tmp =  [1,2,3,4,5,6];

    
  let value = await Promise.all(tmp.map(id => getIdAfterTimeout(id)));
  
  console.log(value);

}

  
getIdAfterTimeout = (id) => {

  return new Promise((resolve, reject) => {
    
    setTimeout(() => {
      return resolve(id);
    }, 2000);
  
  })

}
exec();
0 голосов
/ 06 февраля 2019

Вы можете преобразовать функцию со стилем обратного вызова в обещание.

Мой пример для вас:

async function getData() {
    temparray[] = {data to iterate over};

    let persons = await getAgents(temparray);
    console.log(persons);
    console.log('done');
};

async function getAgents(temparray) {
    await Promise.all(
        temparray.map((deal) => {
            return new Promise(resolve => {
                pipedrive.Persons.get(deal.agent, function(err, person) {
                    if (err) throw err;
                    console.log("trying to get agent " + deal.agent)
                    console.log(person.name);
                    resolve(person);
                });
            })
        })
    );
};

Вы можете использовать Promise.all или old school for loop (fori), Я думаю, вам нужно больше узнать о Promise async / await.

0 голосов
/ 06 февраля 2019

async function getData(){

  // this or you can do await 
  Promise.all(temparray.map(temp => getAgents(temp)))
  .then(data => {

    console.log('done');
  })
  .catch(e => {
    console.log('error' );

  })
  
  // if you do await .. do like this 
  
  const {error, data } = await Promise.all(promises);
  
  console.log(data);

}
function getAgents(id){
  return new Promise((resolve, reject) => {
      pipedrive.Persons.get(deal.agent, function(err, person){
                  if (err) 
                    return resolve({error: err, data: null});

                  return resolve({error : null, data: person});
      });
  }); // end of promise
}
...