我对Web开发还很陌生,因此很难正确地解决这条路。我想路由到API,然后将api中的数据插入到我的mongo db中,然后将结果呈现到车把模板。我猜不到兑现承诺的事情。下面的代码:
代码运行api调用,获取数据,甚至插入db,但之后将不渲染模板(我最初使用api响应来渲染它,但是当它渲染到api时我希望附加一个db id。模板)。我确信这与诺言有关。我尝试了没有运气的回调,所以尝试了异步/等待功能,这似乎也不起作用。同样,多个回调仍然存在问题,因此我尝试了其他方法。
代码运行api调用,获取数据,甚至插入db,但之后将不渲染模板(我最初使用api响应来渲染它,但是当它渲染到api时我希望附加一个db id。模板)。我确信这与诺言有关。我尝试了没有运气的回调,所以尝试了异步/等待功能,这似乎也不起作用。同样,多个回调仍然存在问题,因此我尝试了其他方法。
async function getRecipeData(param) {
let res = await axios.get("https://api.edamam.com/search?q=" + param + "&app_id=0abb0580&app_key=bc931d03c51359082244df2fa414c487");
var dataArray = res.data.hits
return (dataArray);
}
async function insertSearchedRecipes(resArray) {
let response = await
Recipe.create({
name: resArray[i].recipe.label,
image: resArray[i].recipe.image,
url: resArray[i].recipe.url
});
return response;
};
router.get('/getRecipes/:ingredient', function (req, res) {
res.redirect("/");
var params = req.params.ingredient;
console.log(params);
let recipeFind = getRecipeData(params);
recipeFind.then(function (result) {
console.log(result[0]);
for (i = 0; i < result.length; i++) {
var recipeFindCreate = insertSearchedRecipes(result);
};
recipeFindCreate.then(function (results) {
console.log("HELLO")
// console.log(results);
res.render("recipeResults", {
data: results
});
});
});
});
答案 0 :(得分:0)
标准陷阱async
/ await
。从函数定义为async
返回的值必须始终通过await
/ then
获得。
通过呼叫recipeFindCreate
,您只需等待最后一个,其余的将变为异步。
let _ = [];
for (i = 0; i < result.length; i++) {
_.push(insertSearchedRecipes(result));
};
let results = await Promise.all(_);
重构代码时,请确保在函数中声明了每个变量。
async function insertSearchedRecipes(resArray) {
let response = await
Recipe.create({
name: resArray.recipe.label, //NOT: `resArray[i]`
image: resArray.recipe.image,
url: resArray.recipe.url
});
return response;
};
//and:
var recipeFindCreate = insertSearchedRecipes(result[i]); // not `result`
另外,看看散装/浴缸插入物主题-添加一次操作产生的数据系列。
顺便说一句:请不要使用var
(全局范围)。更好地使用let
/ const