【问题标题】:Promise gets resolved on its own承诺会自行解决
【发布时间】:2021-07-15 10:58:09
【问题描述】:

函数自行解析,函数不返回任何数据,但返回 null。 谁能帮我解决这个问题?

打印如下:

  • [ RowDataPacket { payment_id: 'PAYID-MDRPLBY9LS10853614735924' } ]​​i>
  • 数据不是 000000
  • 数据不是 1111111
  • promise2
  • 获取付款响应
  • 支付对象

但应该是:

  • [ RowDataPacket { payment_id: 'PAYID-MDRPLBY9LS10853614735924' } ]​​i>
  • 数据不是 000000
  • 数据不是 1111111
  • 获取付款响应
  • 支付对象
  • promise2

async function func(req, res) {
  return new Promise((resolve, reject) => {
    let email_id = req.body.email_id;
    let arr = [];
    let ctr = 0;
    sql_get_orderid =
      "Select payment_id from paypal.execute_order where email_id=?";

    db.query(sql_get_orderid, [email_id]).then(function (data) {
      console.log(data);
      if (data.length != 0) {
        console.log("data not 000000");
        data.forEach((x) => {
          console.log("data not 1111111");
          var paymentId = x.payment_id;
          paypal.payment.get(paymentId, function (error, payment) {
            if (error) {
              console.log(error);
              reject({ auth: true, message: "Error on the Server" });
            } else {
              console.log("Get Payment Response");
              console.log(JSON.stringify(payment));
              arr[ctr] = payment;
              ctr = ctr + 1;
              // resolve(payment);
              // if(ctr==data.length)
            }
          });
        });
        resolve(arr);
      }
    });
  });
}


router.post(
  "/get_all_orders",
  VerifyToken.Token_Verification,
  async (req, res) => {
    let arr = await func(req, res);
    console.log("promise2");
    res.send({ data: arr });
  }
);

【问题讨论】:

  • “自行解决”是什么意思?
  • 承诺不是这样运作的。如果它得到解决,那是因为resolve 被调用了。如果用null 解决,那么payment 就是null。
  • @rayhatfield 如果 resolve 被调用,那么它应该返回支付对象,但它没有。我能够打印支付对象.....支付值是之后得到的,但函数提前返回 null。
  • 您如何使用getPaymentDetails?你所说的“提前返回”让我觉得你正试图从异步回调中返回数据。此外,它不需要 async 关键字,因为您从未使用过 await。
  • @KevinB 编辑了...的代码,还提供了付款ID供您查看

标签: node.js asynchronous async-await


【解决方案1】:

你的日志没有按照你期望的顺序是因为 forEach 在 javascript 中需要一个同步回调函数。 它不会等待其回调中的承诺或回调返回。 因此,在您的代码中,当调用 func 并执行一次 db.query 并且如果 data.length 有效 data not 000000 将被记录。 然后迭代从 forEach 开始。这里对于迭代中的每个元素 data not 1111111 将被记录,并通过 paypal.paymeny.get 方法进行异步调用。 如上所述,forEach 回调不会等待它得到解决并继续下一次迭代,依此类推。 一旦迭代完成,就会调用 resolve。当 resolve 被调用时,paypal.paymeny.get 尚未返回,因此将传递空数组。 然后,当控件传递给路由处理程序时,promise2 会被记录下来。 Get Payment Response 稍后会在 paypal.payment.get 返回后记录。

为避免这种情况,可以借助 Promise 控制执行顺序。请尝试以下代码。

async function func(req, res) {
    try {
        const email_id = req.body.email_id;
        const sql_get_orderid =
            "Select payment_id from paypal.execute_order where email_id=?";

        const data = await db.query(sql_get_orderid, [email_id]);

        if (!data.length)
            return;

        console.log('data not 000000');
        const getPaymentPromises = data.map(x => new Promise((resolve, reject) => {
            console.log("data not 1111111");

            paypal.payment.get(x.payment_id, (error, payment) => {
                if (error)
                    return reject(error);

                console.log("Get Payment Response");
                console.log(JSON.stringify(payment));
                resolve(payment);
            });
        }));

        return await Promise.all(getPaymentPromises);
    } catch (error) {
        return { auth: true, message: 'Error on the Server' };
    }
}

【讨论】:

  • 解释你的答案有很大帮助,只是粘贴代码并不能说太多
  • 当然@web_walkerX
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
相关资源
最近更新 更多