首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将两个回调合并为一个返回

将两个回调合并为一个返回
EN

Stack Overflow用户
提问于 2019-07-12 06:26:28
回答 4查看 2K关注 0票数 1

所以我有个密码:

代码语言:javascript
运行
复制
module.exports.getEstimate = (event, context, callback) => {
 var data = JSON.parse(event.body);

 lalamove.getQuotation(data ,context, function(err, llm_data){
  callback(null,llm_data)
 });
};

因此,它调用lalamove.getQuotation函数并返回一个对象:

{ "totalFee": "108", "totalFeeCurrency": "PHP" }

现在,我添加了一个新函数,它返回这个对象:

{ "totalFee": "10", "totalFeeCurrency": "PHP" }

从一个不同的函数,所以我认为我应该把它们放在一个数组中,然后当我调用回调时,它不起作用,这就是我尝试过的

代码语言:javascript
运行
复制
module.exports.getEstimate = (event, context, callback) => {
var data = JSON.parse(event.body);
var response = []

lalamove.getQuotation(data ,context, function(err, llm_data){
  const llm_obj = { "lalamove": llm_data }
  response.push(llm_obj);
});

inhouse.getQuotation(data ,context, function(err, ih_data){
  const ih_obj = {"inhouse": ih_data }
  response.push(ih_obj);
});

callback(null,response);
};

我想要的是这样的回应:

代码语言:javascript
运行
复制
["lalamove": { "totalFee": "108", "totalFeeCurrency": "PHP" },
"inhouse": { "totalFee": "10", "totalFeeCurrency": "PHP" }]

我做错什么了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-12 07:00:51

欢迎来到世界的Javascript世界-回调地狱。

我们对你的情况有一些选择:回调地狱,异步库,承诺,异步/等待.

回调地狱:在回调中调用异步函数

代码语言:javascript
运行
复制
module.exports.getEstimate = (event, context, callback) => {
  var data = JSON.parse(event.body);
  var response = []

  lalamove.getQuotation(data, context, function (err, llm_data) {
    const llm_obj = { "lalamove": llm_data }
    response.push(llm_obj);

    // lalamove.getQuotation done!
    // call next action
    inhouse.getQuotation(data, context, function (err, ih_data) {
      const ih_obj = { "inhouse": ih_data }
      response.push(ih_obj);

      // inhouse.getQuotation done!
      // call the last action
      callback(null, response);
    });
  });
};

异步库:异步 --您可以使用waterfall函数按顺序执行操作,如果顺序无关紧要,则使用parallel

代码语言:javascript
运行
复制
module.exports.getEstimate = (event, context, callback) => {
  var data = JSON.parse(event.body);
  var response = []

  async.parallel([
    function (next) {
      lalamove.getQuotation(data, context, function (err, llm_data) {
        // TODO: check err object
        const llm_obj = { "lalamove": llm_data }
        response.push(llm_obj);

        // lalamove.getQuotation done!
        // do next action
        next();
      });
    },
    function (next) {
      inhouse.getQuotation(data, context, function (err, ih_data) {
        const ih_obj = { "inhouse": ih_data }
        response.push(ih_obj);

        // inhouse.getQuotation done!
        // do next action
        next()
      });
    }
  ], function (err) {
    // TODO: check err object
    // call the last action
    callback(null, response);
  });
};
票数 2
EN

Stack Overflow用户

发布于 2019-07-12 06:33:51

您的callback(null,response)不会等待这两个回调函数完成。您可以使用允诺并使用Promise.all(objs).then(function)等待所有承诺完成并运行。

票数 4
EN

Stack Overflow用户

发布于 2019-07-12 06:41:03

尝试在Promise中包装两个引号,然后使用Promise.all等待它们都完成,然后将结果返回给callback

代码语言:javascript
运行
复制
module.exports.getEstimate = (event, context, callback) => {
    let data = JSON.parse(event.body);

    // wrap quotation calls in `Promise`
    Promise.all([
        new Promise(resolve => lalamove.getQuotation(data, context, (err, lalamove) => resolve({ lalamove }))),
        new Promise(resolve => inhouse.getQuotation (data, context, (err, inhouse ) => resolve({ inhouse  }))),
    ]).then(response => {
        // return the result back to `callback`
        callback(null, response);
    })
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57001273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档