You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Node.js中将Yummly API模块输出保存到数组而非控制台打印

解决Yummly查询结果无法存入变量的问题

刚接触JavaScript和Node.js的时候,异步操作确实是个容易踩坑的点——你遇到的问题本质上是异步代码的执行顺序导致的,不是push/concat方法没用,而是你可能在数据还没返回的时候就去访问变量了。

为什么之前的尝试无效?

Yummly的API调用是异步的:当你调用yummly.search()的时候,Node.js会把这个请求扔到后台处理,继续执行后面的代码,而不是等请求完成。所以如果你在search()外面直接打印变量,那时候数据还没回来,变量自然是空的;就算你在外面用push,也是在空数组上操作,而真正的数据回来时,你可能已经不再关注这个变量了。

正确的实现方式

下面给你两种常用的方法,先从基础的回调函数开始,再到更直观的async/await写法:

方法1:使用回调函数(最基础的异步处理方式)

const Yummly = require('yummly');
// 初始化Yummly实例,替换成你的API密钥
const yummly = new Yummly({
  app_id: '你的APP_ID',
  app_key: '你的APP_KEY'
});

// 定义变量来存储结果
let recipeList = [];
let recipeDict = {};

// 在回调函数里处理返回的数据
yummly.search({ q: 'pasta' }, (err, response) => {
  if (err) {
    console.error('查询失败:', err);
    return;
  }

  // 把结果存入数组
  recipeList = response.matches;
  console.log('存入数组的食谱:', recipeList);

  // 转成字典(对象),用食谱ID作为键
  recipeList.forEach(recipe => {
    recipeDict[recipe.id] = recipe;
  });
  console.log('转成字典的食谱:', recipeDict);

  // 所有需要使用这些数据的逻辑,都要放在这个回调函数里面
  // 比如在这里调用其他函数处理数据
});

// ❌ 注意:这里直接打印recipeList会得到空数组,因为回调还没执行!
// console.log(recipeList);

方法2:使用async/await(更易读的现代写法)

如果觉得回调嵌套看着麻烦,可以把异步操作包装成Promise,再用async/await来写,逻辑和同步代码更像:

const Yummly = require('yummly');
const yummly = new Yummly({
  app_id: '你的APP_ID',
  app_key: '你的APP_KEY'
});

// 把Yummly的查询包装成Promise
function fetchRecipes(query) {
  return new Promise((resolve, reject) => {
    yummly.search(query, (err, response) => {
      if (err) reject(err);
      else resolve(response.matches);
    });
  });
}

// 用async函数执行异步操作
async function getRecipes() {
  try {
    // 等待查询完成,把结果存入变量
    const recipeList = await fetchRecipes({ q: 'pasta' });
    console.log('存入数组的食谱:', recipeList);

    // 转成字典
    const recipeDict = {};
    recipeList.forEach(recipe => {
      recipeDict[recipe.id] = recipe;
    });
    console.log('转成字典的食谱:', recipeDict);

    // 这里可以继续用recipeList和recipeDict做任何操作
  } catch (err) {
    console.error('查询出错:', err);
  }
}

// 调用这个async函数
getRecipes();

关键要点

  • 所有依赖异步数据的代码,必须放在异步操作完成之后:要么在回调函数内部,要么在await之后的代码块里。
  • 转字典(JavaScript里叫对象)的逻辑很简单:遍历数组,用每个元素的唯一标识(比如食谱的id)作为对象的属性名,元素本身作为属性值。

内容的提问来源于stack exchange,提问作者Teckrio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:36:30