【问题标题】:Promise middleware in node js callback functions how to use multiple then?Node js回调函数中的Promise中间件如何使用多个呢?
【发布时间】:2015-08-31 05:58:32
【问题描述】:

我是 node js 的新手,我在 node js 中使用Promise 中间件。 但是我没有发现它的文档对我有用,并且无法理解如何在一个请求中使用两个回调或者应该如何使用多个。 请帮助我,谢谢。

这是我的代码

//get application types
var p1 = new Promise(function(resolve, reject) {
  console.log("in p1");
  var url = tURL+'applicationType/getAll'
  var args = {
    headers:{"AuthKey": req.session.name}
  };
  client.get(url, args, function(data,response) {
      console.log(data, "in get all app type req");
      if(data.status == "success"){
        return resolve(data);
      }
      else{
        reject ("unamble to get data!")
      }
  });
});

p1.then(function(data) {
  console.log(data.response.applicationType, "in p1 then", data)
  //load page after data
  res.render('app', {
    message: req.session.name,
    uName: "THE MECHANIC",
    applist: data.response.applicationType
  });
},function(reason) {
  console.log(reason, "reason in not then"); // Error!
});



//get all application
var p2 = new Promise(function(resolve, reject){
  console.log("in p2");
  var url = tURL+'applications'
  var args = {
    headers:{"AuthKey": req.session.name}
  };
  client.get(url, args, function(data,response) {
      console.log(data, "in get app req");
      if(data.status == "success"){
        return resolve(data);
      }
      else{
        reject ("unamble to get data!")
      }
  });
});

p2.then(function(data) {
  console.log(data.response, "in p2 then", data)
  //load page after data
  res.render('app', {
    appList: data.response
  });

},function(reason) {
  console.log(reason, "reason in not p2"); // Error!
});

正在寻找的解决方案 1.两个请求完成后,我必须在页面上发送数据。 2. 如何管理对象中的响应并使用render 或任何替代方法将其发送到页面?

【问题讨论】:

  • 尝试使用Promise.all() 来检查多个promise 是否被解析。
  • @Sonaryr 在我的情况下如何使用它你能解释一下吗?
  • 类似Promise.all([p1,p2]).then(function(res){...});检查npmjs.com/package/promise#promise-all-array

标签: javascript node.js promise middleware


【解决方案1】:

我的第一个建议是找到一种以原生方式承诺 client.get 的方法,我不确定它代表什么库,并且它没有像 fun(err, data) 那样遵循节点样式回调,除此之外,我是假设,你有一个请求到你的服务器,你携带多个请求到其他东西,然后捆绑所有的响应并响应请求者,对吗?

我会像这样重构代码

function pGet(url, args){
  return new Promise(function(resolve, reject){
    client.get(url, args, function(data, response){
      if(data.status === 'success') resolve(data);
      else reject('unable to get data');
    });
  });
}

router.get('/api/someAPI', function(req, res, next){
  var resultJSON = {
    message: req.session.name,
    uName: "THE MECHANIC"
  }, args = { headers:{"AuthKey": req.session.name} },
  p1, p2;

  p1 = pGet(tURL+'applicationType/getAll', args)
    .then(function(data){
      resultJSON.applist = data.response.applicationType;
    }).catch(console.log.bind(console));

  p2 = pGet(tURL+'applications', args)
    .then(function(data){
      resultJSON.appList = data.response;
    }).catch(console.log.bind(console));

  // now we send the response once both of the promises finish
  Promise.all([p1, p2]).then(function(){
    res.render('app', resultJSON); 
  }); // not adding any error handler since both the previous ones should not throw any.

});

【讨论】:

  • 回调(jsonData, res); ^ TypeError: undefined is not a function
  • 我没有看到任何callback,你能用代码更新你的问题
  • pget 函数在您的 sn-p 中的作用是什么?怎么称呼?
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2020-10-22
  • 2017-03-31
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多