Estoy escribiendo una llamada de servidor para completar un mapa. Parece que no puedo obtener el código correcto en cuanto a dónde esperará hasta que finalice la llamada del servidor antes de continuar. Escribí la siguiente función DoIt que llama a someTimeConsumingthing que llama al servidor y llena el mapa. Hará la llamada del servidor en SomeTimeConsumingThing, sin embargo, luego saltará de la función e irá al siguiente bloque de código.
export function onBeforePriceRules(quote, lineModels, conn) { var varQuoteHostid; if (lineModels.length) { var varProdIds = []; //Might want to do a function here. lineModels.forEach(function (line) { varQuoteHostid = quote.record["Host__c"]; var varProdId = line.record["SBQQ__Product__c"]; if (varProdId) { varProdIds.push(varProdId); } }); } const UniqueProdList = [...new Set(varProdIds)]; var ProdIdList = "('" + UniqueProdList.join("', '") + "')"; let myMap; var ProductMap = new Map(); //Call DoIt doit(conn, ProdIdList, ProductMap).then(function () { console.log("Now finally done!"); debugger; }); var NewVarable = "NewThing"; console.log("NewVarable" + NewVarable); debugger; return Promise.resolve(); } function someTimeConsumingThing(conn, ProdIdList, ProductMap) { console.log("someTimeConsumingThing"); debugger; conn .query("SELECT Id, Model__c FROM Product2 WHERE ID IN" + ProdIdList) .then(async function (returnedRecords) { if (returnedRecords.totalSize) { returnedRecords.records.forEach(function (record) { ProductMap.set(record.Id, record); console.log("ProductMap" + ProductMap); debugger; }); } }); return ProductMap; } async function doit(conn, ProdIdList, ProductMap) { console.log("Calling someTimeConsumingThing"); debugger; await someTimeConsumingThing(conn, ProdIdList, ProductMap); console.log("Ready with someTimeConsumingThing"); debugger; }Estás creando una promesa cuando usas
conn .query("SELECT Id, Model__c FROM Product2 WHERE ID IN" + ProdIdList) y extiende esa promesa llamando then lo que literalmente significa hacer algo después de que la promesa se haya resuelto. El problema es que no está esperando esa promesa en ningún lado, sino que crea una nueva justo después de eso, que regresa y await en la función doit .
return new Promise(function (resolve, reject) { setTimeout(resolve, 2000); }); Lo que quiere es esperar la promesa de consulta real, así que edite su someTimeConsumingThing para devolver la promesa de consulta, así
function someTimeConsumingThing(conn, ProdIdList, ProductMap) { console.log("someTimeConsumingThing"); debugger; // Imagine this as a block, that executes some time somewhere. // Everything outside of it gets executed when you call this function return conn .query("SELECT Id, Model__c FROM Product2 WHERE ID IN" + ProdIdList) .then(async function (returnedRecords) { if (returnedRecords.totalSize) { returnedRecords.records.forEach(function (record) { ProductMap.set(record.Id, record); console.log("ProductMap" + ProductMap); debugger; }); } }); }Lo mismo con la sintaxis async/await
async function someTimeConsumingThing(conn, ProdIdList, ProductMap) { console.log("someTimeConsumingThing"); debugger; // Await for the query results const returnedRecords = await conn .query("SELECT Id, Model__c FROM Product2 WHERE ID IN" + ProdIdList) if (returnedRecords.totalSize) { returnedRecords.records.forEach(function (record) { ProductMap.set(record.Id, record); console.log("ProductMap" + ProductMap); debugger; }); } return whateveryouwant }¡Lea más sobre las promesas aquí y no tenga miedo de buscar en Google cómo funcionan y/o la explicación de ellas!