1

この例を考慮に入れる:

app.get('/url/:param', function(req, res, next) {
  var param = req.params.param;
  method1(param, function(err, model) {
    if(err) return next(err);
    method2(model, function(err, models) {
      if(err) return next(err);
      if(models.length > 0) {
        method3(mode, models, function(err, models2) {
          res.render("index.html", {model: model, models: models, models2: models2});
        });
      } else {
        res.render("index.html", {model: model, models: models});
      }
    });
  });
}

promise を使用してこの例を単純化する方法はありますか? すべてのメソッドが依存しており、次のような検証があることを確認してください。さらに、一意の場所if(models.length > 0) にグループ化する必要があります。res.render

4

3 に答える 3

1

はいあります。これを、失敗または成功する 1 つの Promise に減らし、それぞれのハンドラーとしてnextおよびをインストールできます。res.renderただし、結果は以前のすべての結果に依存するため、ピラミッドが最も簡単なままです。Q.js を仮定すると:

app.get('/url/:param', function(req, res, next) {
  Q.nfcall(method1, req.params.param).then(function(model) {
    return Q.nfcall(method2, model).then(function(models) {
      if(models.length > 0)
        return Q.nfcall(method3, mode, models).catch(function(err) {
          // you're not dealing with errors here
          // omit this `.catch()` call if you want to let it reach the `next()`
        }).then(function(models2) {
          return {model: model, models: models, models2: models2};
        });
      else
        return {model: model, models: models};
      }
    });
  }).done(function(results) {
    res.render("index.html", results);
  }, next);
}
于 2014-05-04T21:23:38.507 に答える