问题:我应该从诺言中得到我要解决的适当对象。但是最后我会得到空的对象。我正在执行的SQL查询工作正常。唯一的事情就是正确的返回值。
调试:当我尝试在解决对象值之前对其进行控制时;在说“ [Promise {}]”。
我得到的输出:
{
"status": true,
"data": [
{},
{}
],
"errors": null,
"msg": "Hahaha"
}
代码
export const executeAllQueries = (allQueries) => {
return allQueries.map ( async productQuery => {
try {
let res = await executeProductQuery (productQuery);
console.log(res);
return res;
} catch (error) {
console.log(error);
return error;
}
})
}
const executeProductQuery = async (productQuery) => {
let parentResponse = await new Promise ((resolve, reject) => {
mysql.query( productQuery.parent.sql , productQuery.parent.data, (parentError, parentResult) => {
if (parentError)
reject ( { status: false, parent_sku: productQuery.parent.data[1], error: parentError.message } )
else {
resolve( { status: true, parent_sku: productQuery.parent.data[1], parent_id: parentResult.insertId , error: null } )
}
})
});
if (parentResponse.status === true)
{
let variantPromises = productQuery.varients.map (async varientQuery => {
try {
return await executeVariantQuery(varientQuery, parentResponse.parent_id)
} catch (error) {
console.log(error);
return error;
}
});
return { parent: parentResponse, varient: variantPromises }
}
}
const executeVariantQuery = async ( varientQuery, parent_id ) => {
let varientResponse = await new Promise ((resolve, reject) => {
varientQuery.varient.data[11] = parent_id;
mysql.query(varientQuery.varient.sql, varientQuery.varient.data, (varientError, varientResult) => {
if (varientError)
reject ( { status: false, error: varientError.message } )
else {
resolve( { status: true, varient_id: varientResult.insertId , error: null } )
}
})
})
if (varientResponse.status === true) {
let attributePromises = varientQuery.attributes.map(async attribQuery => {
try {
return await executeAttributeQuery(attribQuery);
} catch (error) {
console.log(error);
return error;
}
})
return { varient: varientResponse, attributes: attributePromises }
}
}
const executeAttributeQuery = async (attribQuery) => {
let attribResponse = await new Promise((resolve, reject) => {
mysql.query(attribQuery.sql, attribQuery.data, (attribError, attribResult) => {
if (attribError)
reject ( { status: false, error: attribError.message } )
else {
resolve( { status: true, varient_id: attribResult.insertId , error: null } )
}
})
})
return attribResponse;
}
执行顶级方法executeAllQueries()
如下:
let completeVariants = isolateVariantProducts(fileRows); // All products are isolated in separate groups. Each group has a parent and it's variants.
let allQueries = generateCompleteQueriesForVariant(completeVariants);
let responses = executeAllQueries(allQueries);
res.status(200).json({status: true, data: responses, errors: null, msg: 'Hahaha'})
可运行的NodeJS代码段:
let allQueries = [{parent: 1, varients: [1,2,3,4]}, {parent: 2, varient: [5,6,7,8]}]
const executeAllQueries = (allQueries) => {
return allQueries.map ( async productQuery => {
try {
return await executeProductQuery (productQuery);
} catch (error) {
return error;
}
})
}
const executeProductQuery = async (productQuery) => {
let parentResponse = await new Promise ((resolve, reject) => {
if (true)
resolve({ status: true, parent: productQuery.parent, msg: "Resolved"})
else
reject({status: false, parent: productQuery.parent, msg: "Rejected"})
});
if (parentResponse.status === true)
{
let variantPromises = productQuery.varients.map (async varientQuery => {
try {
return await executeVariantQuery(varientQuery)
} catch (error) {
return error;
}
});
return { parent: parentResponse, varient: variantPromises }
}
}
const executeVariantQuery = async ( varientQuery ) => {
let varientResponse = await new Promise ((resolve, reject) => {
if (true)
resolve ( { status: true, msg: "Resolved" } )
else {
reject ( { status: false, msg: "Rejected" } )
}
});
return varientResponse;
}
console.log(executeAllQueries(allQueries));
答案 0 :(得分:1)
executeAllQueries
返回承诺数组。您应该执行Promise.all()
才能获得结果。
// Instead of
let responses = executeAllQueries(allQueries);
// do
let responses = await Promise.all(executeAllQueries(allQueries));