Foreach не работает, подталкивая каждую запись к функции обещания в NodeJS - PullRequest
0 голосов
/ 11 января 2019
parse().then(function (contacts) {
    contacts.forEach(cont => {
        cont.id,
            cont.first_name,
            cont.last_name,
            cont.phone_numbers,
            cont.organization_name,
            cont.email

        appoloemail = cont.email;
        fullname = cont.first_name + ' ' + cont.last_name;

        deal = cont.first_name + ' Deal';
        dealname = deal;
        orgname = cont.organization_name;
        title = cont.title;
 console.log('ORG NAME in Start:', orgname)
        console.log('Full Name: ', fullname)
        console.log('Email', appoloemail);
        console.log('Custom Time: ', newbacktime);
        console.log('Contact Update Time: ', contact_updatedate);

       create_org(orgname)
            .then(function (orgid) {
                console.log('Org Id Return:', orgid);
                globalorgid=orgid;
                console.log('In create org: ',globalorgid)
                createperson(fullname, orgid, appoloemail, apollophone)

            })
            .catch(function (err) {
                console.log('Error!', err);
            })
        //  }
console.log('Loop End::');
    })

}).catch(function (err) {
    console.log(err);
});

Цикл сначала выполняет итерацию каждой записи, а затем начинает отправку записи, и org и person, но функция org завершает выполнение и отправляют все данные org, кроме данных push create_person, которые находятся в последнем индексе массива цикла foreach и каждой организации. иметь одно и то же имя человека.

Ответы [ 2 ]

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

forEach() выполняется синхронно, но внутри имеется асинхронный код (при условии, что create_org и createperson обещания возврата). Вы должны использовать Promise.all () .

Стиль ES6

parse()
.then(contacts =>
  Promise.all(contacts.map(
    cont => create_org(cont.organization_name)
    .then(orgid => createperson(`${cont.first_name} ${cont.last_name}`,
                                orgid,
                                cont.email,
                                cont.phone_numbers)
))))    
.catch(err => {
  console.log(err);
});

Стиль ES5 (но не настоящий ES5)

parse()
.then(function(contacts) {
  return Promise.all(contacts.map(function(cont) {
    return create_org(cont.organization_name)
    .then(function(orgid) { // This is the result of create_org()
      return createperson(cont.first_name + ' ' + cont.last_name',
                          orgid, // orgid is used here
                          cont.email,
                          cont.phone_numbers);
    });
  }));
}) 
.catch(err => {
  console.log(err);
});
0 голосов
/ 11 января 2019

Тогда часть вашего create_org(orgname) будет выполнена где-то во времени. И похоже, что ваши переменные определены с var, а не let. Итак, либо вы определяете свои переменные внутри forEach с помощью let, либо просто заменяете forEach на что-то вроде

Promise.all(contacts.map(
        contact=>create_org(contact.organization_name)
        .then(orgid=>createperson(contact.first_name+' '+conact.last_name,orgid,contact.email,contact.phone_numbers))
    )
)
...