【问题标题】:Java script callback not synchronousJavascript回调不同步
【发布时间】:2021-04-02 09:56:16
【问题描述】:

我想做什么:

在支付网关服务器中放置支付订单并将订单详细信息返回给客户端

使用 firebase 云函数

Order() 执行异步工作并在function(err,data) 中返回订单数据

我尝试了什么:

如您所见,我尝试使用 callback 机制同步它,但似乎无法完成这项工作。仍然返回 null

index.js 代码

  const functions = require("firebase-functions");

 


/* eslint-disable */
exports.order = functions.https.onCall((amnt, context) => {
    
    var orderdata;
    const Ippopay = require('node-ippopay');
    var ippopay_instance = new Ippopay({
        public_key: 'pk_live_0WZhCNC5l7PJ',
        secret_key: 'secret ;) ',
      });
      
    function Order(callback){
     ippopay_instance.createOrder({
          amount: amnt,
          currency: 'DOLLAR',
          payment_modes: "cc,dc,nb",
          customer: {
              name: "Test",
              email: "test@gmail.com",
              phone: {
                  country_code: "63",
                  national_number: "5876543210"
              }
          }
      },

          function (err, data) {

            orderdata=data;
          });    
          callback(orderdata);
    }
    return Order(function(order) {
        //response.send(order);
        return orderdata;
    });   
});

【问题讨论】:

  • 只需将callback(orderdata) 移动到function (err, data) {...} 中。如果不这样做,回调将在 orderdata 填充之前运行。
  • 不幸的是这不起作用..它应该有,但它没有
  • 那么你需要进一步调试它......“不起作用”并没有给我们任何关于问题确切性质的线索。如有必要,您需要逐行进行更详细的调查
  • 我原以为function (err, data) { callback(data); }); 实际上就是您所需要的。所以也许检查你没有任何控制台错误,检查 data 是否真的包含你所期望的,检查函数是否正在执行,等等。
  • 你已经问过这个问题 3 次了,herehere 现在在这里。查看您的最新代码,您忽略了之前的答案中给出的建议。

标签: javascript node.js firebase google-cloud-functions asynccallback


【解决方案1】:

ippopay_instance.createOrder()内部的回调函数可以返回值,但调用该函数的代码不会关注返回值。

我尝试将您的 ippopay_instance.createOrder() 包装在 promise 中。

const functions = require("firebase-functions");

/* eslint-disable */
exports.order = functions.https.onCall((amnt, context) => {
  const Ippopay = require("node-ippopay");
  const ippopay_instance = new Ippopay({
    public_key: "pk_live_0WZhCNC5l7PJ",
    secret_key: "secret ;) ",
  });
  const param = {
    amount: amnt,
    currency: "DOLLAR",
    payment_modes: "cc,dc,nb",
    customer: {
      name: "Test",
      email: "test@gmail.com",
      phone: {
        country_code: "63",
        national_number: "5876543210",
      },
    },
  };

  function getStuffAsync(param) {
    return new Promise(function (resolve, reject) {
      ippopay_instance.createOrder(param, function (err, data) {
        if (err !== null) reject(err);
        else resolve(data);
      });
    });
  }

  return getStuffAsync(param);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2015-07-30
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多