Estoy seguro de que este es un problema con mi comprensión/implementación. El problema es que estoy tratando de devolver la ID del objeto creado a una matriz para que esa matriz pueda insertarse más tarde en otro objeto. Moviendo el .then() entre la función, la llamada, nada parece funcionar. Empujar a la matriz, asignar el valor a la matriz a través del índice no parece funcionar. Se agradece cualquier información/orientación sobre cuál es el problema raíz y un camino para resolverlo.
const contacts = document.getElementsByName('newContact'); const contactName = document.getElementsByName('contactName'); const contactTitle = document.getElementsByName('contactTitle'); const contactPhone = document.getElementsByName('contactPhone'); const contactEmail = document.getElementsByName('contactEmail'); let contactIDArray = new Array(); for (let i = 0; i < contacts.length; i++) { const name = contactName[i].value; const title = contactTitle[i].value; const phone = contactPhone[i].value; const email = contactEmail[i].value; var id; createContact(name, title, phone, email).then(function (res) { id = res.data.id; alert(res.data.id); return id; }); alert(id); import axios from 'axios'; export const createContact = async (contactName, contactTitle, contactPhone, contactEmail) => { try { const res = await axios({ method: 'POST', url: '/api/v1/contacts', data: { contactName, contactTitle, contactPhone, contactEmail, }, }); return res.data.id; } catch (err) { console.log(err); } };Hay varios problemas que puedo ver:
.data.id en un valor que ya es una identificaciónPromise util ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all podría ser lo que está buscando por).Por ejemplo, iría con algo en ese sentido (no probado):
const contacts = document.getElementsByName('newContact'); const contactName = document.getElementsByName('contactName'); const contactTitle = document.getElementsByName('contactTitle'); const contactPhone = document.getElementsByName('contactPhone'); const contactEmail = document.getElementsByName('contactEmail'); let contactIDArray = new Array(); const requests = [] for (let i = 0; i < contacts.length; i++) { const name = contactName[i].value; const title = contactTitle[i].value; const phone = contactPhone[i].value; const email = contactEmail[i].value; var id; promise = createContact(name, title, phone, email).then(function (res) { const id = res.data.id; alert(res.data.id); return id; }); requests.push(promise) } Promise.all(requests).then(ids => { // This should contain the array of ids alert(ids) })Editar: Además, tenga cuidado al compartir el resultado entre llamadas sincrónicas y asincrónicas, por lo general, permanecería en el mundo asincrónico una vez que comenzara sus tareas asincrónicas, como se indica aquí: Cómo devolver datos de la promesa
I'm trying to return the ID of the created object into an array so that array can later be inserted into another object
En base a su solicitud, tengo algunas cosas para usted:
.then() ) dentro de un ciclo a menos que realmente lo necesite.Por favor, vea el código modificado a continuación:
let contactPromises = []; for (let i = 0; i < contacts.length; i++) { const name = contactName[i].value; const title = contactTitle[i].value; const phone = contactPhone[i].value; const email = contactEmail[i].value; contactPromises.push(createContact(name, title, phone, email)); } let contacts = (contactPromises.length > 0) ? await Promise.all(contactPromises) : []; let contactIds = contacts.map(contact => contact.id); // use your contactIds here let res = await axios({ method: 'POST', url: '/api/v1/contacts', data: { contactName, contactTitle, contactPhone, contactEmail, }, }); return res.data; // <--- return res.data only, not the res.data.id