0

この単純なnodejsアプリケーションがあり、Webアプリケーションのダミーの日付を生成します。それがするのは:

  1. ダミーデータベースを削除します
  2. インベントリコレクションにデータを入力します
  3. 請求書コレクションにデータを入力します
  4. constデータコレクションにデータを入力します

もちろん、すべてのアクションは非同期であり、次々に実行したいと思います。私にとっては、この種のフローを管理するための何かを書く方が簡単でしたが、他の種類のフローをサポートする主流のソリューションが必要です。たとえば、並行して実行し、最初の障害ですべてを停止します。

参考までに、私の解決策を描いたスケルトンの下を見つけてください。

/*global require, console, process*/

var mongo, db, inventory, createChain;

function generateInventory(count) {
  // returns the generated inventory
}

function generateInvoices(count, inventory) {
  // returns the generated invoices
}

function generateConst() {
  // returns the generated const data
}

mongo = require('mongojs');
db = mongo.connect('dummy', ['invoices', 'const', 'inventory']);

createChain = function () {
  "use strict";
  var chain = [false], i = 0;

  return {
    add: function (action, errMsg, resultCallback) {
      chain[chain.length - 1] = {action: action, errMsg: errMsg, resultCallback: resultCallback};
      chain.push(false);
      return this;
    },
    invoke: function (exit) {
      var str, that = this;
      if (chain[i]) {
        chain[i].action(function (err, o) {
          if (err || !o) {
            str = chain[i].errMsg;
            if (err && err.message) {
              str = str + ": " + err.message;
            }
            console.log(str);
          } else {
            if (chain[i].resultCallback) {
              chain[i].resultCallback(o);
            }
            i += 1;
            that.invoke(exit);
          }
        });
      } else {
        console.log("done.");
        if (exit) {
          process.exit();
        }
      }
    }
  };
};

createChain()
  .add(function (callback) {
    "use strict";
    console.log("Dropping the dummy database.");
    db.dropDatabase(callback);
  }, "Failed to drop the dummy database")
  .add(function (callback) {
    "use strict";
    console.log("Populating the inventory.");
    db.inventory.insert(generateInventory(100), callback);
  }, "Failed to populate the inventory collection", function (res) {
    "use strict";
    inventory = res;
  })
  .add(function (callback) {
    "use strict";
    console.log("Populating the invoices.");
    db.invoices.insert(generateInvoices(10, inventory), callback);
  }, "Failed to populate the invoices collection")
  .add(function (callback) {
    "use strict";
    console.log("Populating the const.");
    db["const"].insert(generateConst(), callback);
  }, "Failed to populate the const collection")
  .invoke(true);

誰かが関連するnodejsパッケージを提案できますか?これも使いやすいでしょう?

どうもありがとうございます。

4

2 に答える 2

2

このモジュールを使用して、async必要になる可能性のあるほぼすべてのタイプのフロー制御を提供します。特に、このseries方法は順次フロー制御を提供する。

于 2012-09-02T04:27:36.890 に答える
0

実際、シーケンシャルフロー制御には、ウォーターフォールを使用する必要があります

例として:

async.waterfall([
  function(cb){
    cb(null,1);
  },
  function(r,cb){
    // r=1
    cb(null,2)
  },
  function(r,cb){
    // r=2
    cb(null,3)
  }
],function(e,r){
    // e=null
    // r=3
})

これは順次実行されます。エラーを早期にコールバックする場合 (つまり、cb("error"))、e="error" および r=undefined を指定して、最終的な関数 (e,r) に直接移動します function(r,cb) の方法に注意してください{} は、一般的に再利用されるブロックを処理し、将来の作業を容易にするために、util ライブラリで事前に構成することができます。

于 2014-06-19T19:32:24.947 に答える