当前位置: 首页 > 知识库问答 >
问题:

异步回调array.map()

华良平
2023-03-14

几周前刚开始学Node.js....我不明白为什么“products”数组包含null而不是所需的对象....

在第13行,当我对对象进行控制台日志记录时,我得到了所需的对象,但我不明白当我在map函数完成它的执行后在第40行对它们进行控制台日志记录时,它们为什么是空的....

如果数组长度是2(这意味着推入成功),为什么里面存储的对象仍然是空的,而不是我想要存储的对象?

控制台输出

订单模式

exports.getOrders = async (req, res, next) => {
  const userOrders = [];
  Order.find({ 'user.userId': req.user._id }).then((orders) => {
    console.log(orders); // Line 4
    async.eachSeries(
      orders,
      function (order, callback) {
        const products = order.products.map((p) => {
          const seriesId = p.product.seriesId;
          const volumeId = p.product.volumeId;
          Series.findById(seriesId).then((series) => {
            const volume = series.volumes.id(volumeId);
            console.log(volume, p.quantity); // Line 13
            return {
              seriesTitle: volume.parent().title,
              volume: volume,
              quantity: p.quantity
            };
          });
        });
        console.log('Product Array Length: ', products.length); // Line 21
        if (products.length !== 0) {
          const data = {
            productData: products,
            orderData: {
              date: order.date,
              totalPrice: order.totalPrice
            }
          };
          userOrders.push(data);
          callback(null);
        } else {
          callback('Failed');
        }
      },
      function (err) {
        if (err) {
          console.log('Could not retrieve orders'); 
        } else {
          console.log(userOrders);  // Line 40
          res.render('shop/orders', {
            docTitle: 'My Orders',
            path: 'orders',
            orders: userOrders,
            user: req.user
          });
        }
      }
    );
  });
};

共有1个答案

云霖
2023-03-14

在第8行,order.products.map返回一个数组null。因为这是一个异步映射。对于每个产品,您都调用series.findbyid,这是一个承诺,它只在解析时返回值。因为您不是在等待承诺的解决,所以它在每次迭代时都返回null。

您必须首先映射所有的承诺,然后调用promise.all来解析它们,然后,您将得到期望值。

null

exports.getOrders = async (req, res, next) => {
  const userOrders = [];
  Order.find({ 'user.userId': req.user._id }).then((orders) => {
    console.log(orders); // Line 4
    async.eachSeries(
      orders,
      function (order, callback) {
        const productPromise = order.products.map((p) => {
          const seriesId = p.product.seriesId;
          const volumeId = p.product.volumeId;
          //ANSWER:  Return the following promise
          return Series.findById(seriesId).then((series) => {
            const volume = series.volumes.id(volumeId);
            console.log(volume, p.quantity); // Line 13
            return {
              seriesTitle: volume.parent().title,
              volume: volume,
              quantity: p.quantity
            };
          });
        });
        // ANSWER: call all the promises
        Promise.all(productPromise)
        .then(function(products) {
            console.log('Product Array Length: ', products.length);
            if (products.length !== 0) {
            const data = {
              productData: products,
              orderData: {
                date: order.date,
                totalPrice: order.totalPrice
              }
            };
            userOrders.push(data);
            callback(null);
          } else {
            callback('Failed');
          }
        });
      },
      function (err) {
        if (err) {
          console.log('Could not retrieve orders'); 
        } else {
          console.log(userOrders);  // Line 40
          res.render('shop/orders', {
            docTitle: 'My Orders',
            path: 'orders',
            orders: userOrders,
            user: req.user
          });
        }
      }
    );
  });
};
 类似资料:
  • 问题内容: 如何快速进行异步回调?我正在为我的应用程序编写一个小框架,因为它应该同时在iOS和OS X上运行。因此,我将非特定于设备的主要代码放入该框架中,该框架还处理对我的在线api的请求。很显然,我也希望应用程序的GUI以及ViewController在api请求完成后立即做出反应。在Objective- C中,我通过将包含必须在id变量中调用的函数以及函数本身的视图保存在选择器变量中的视图来

  • 稳定性: 1 - 试验的 async_hooks 模块提供了一个用于注册回调函数的 API,这些回调函数可追踪在 Node.js 应用中创建的异步资源的生命周期。可以通过以下方式使用: const async_hooks = require('async_hooks'); Terminology An asynchronous resource represents an object with

  • 回调 用户在支付完成后跳转回来的页面,一般只建议做显示用途。 // SDK实例化,传入公共配置 $pay = new \Yurun\PaySDK\AlipayApp\SDK($params); if($pay->verifyCallback($_GET)) { // 回调验证成功,可以通过GET参数来获取支付宝回传的参数 } else { // 回调验证失败 } 详见:test

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?

  • 问题内容: 我在互联网上读过有关回调的信息,但就我而言我还是听不懂。 我具有此功能,并且在运行时会记录到控制台。但是,现在我需要在另一个功能中使用此响应,而我正在努力做到这一点。 这是我应该得到的地方:(这显然不起作用,因为它不等待响应。) 我真的很难把头放在回调上,我在这里盯着自己瞎了。 问题答案: 回调无法返回值,因为它们将要返回的代码已经执行。 因此,您可以做几件事。一个传递回调函数,异步函