1

を使用して、このスニペットを正常に動作させていasync.applyEachSeriesます。

var async = require("async");

function firstThing(state, next) {
  state.firstThingDone = true;
  setImmediate(next);
}

function secondThing(state, next) {
  state.secondThingDone = true;
  setImmediate(next);
}

var state = {};
async.applyEachSeries([
  firstThing,
  secondThing
], state, function (error) {
  console.log(error, state);
});

私はそれをhighland.jsに変換しようと何度か試みましたが、そこの配管を理解していません。_.wrapCallback(firstThing)firstThing と secondThing の両方に対して行う必要があると確信していますが、必要かどうか、または何が必要_.pipelineかはわかりません.series()

4

2 に答える 2

1

ハイランドの非同期を放棄しようとする私自身の試みで、私は.map(_.wrapCallback).invoke('call')ある程度の規則性で使用するようになりました。ここで使用できます。

var _ = require('highland');

var state = {};

function firstThing(state, next) {
  state.firstThingDone = true;
  setImmediate(next);
}

function secondThing(state, next) {
  state.secondThingDone = true;
  setImmediate(next);
}

_([firstThing, secondThing])
  .map(_.wrapCallback)
  .invoke('call', [null, state])
  .series().toArray(function() {
    console.log(state)
  });

これにより、関数をそのまま維持することができ、2 つ以上の「もの」にうまく拡張されます。applyEachSeries を直接分解したように感じられると思います。

this各関数に異なる引数をバインドまたは渡す必要がある場合は.bind、ストリームを構築するときに使用してcall引数を省略できます。

_([firstThing.bind(firstThing, state),
  secondThing.bind(secondThing, state)])
  .map(_.wrapCallback)
  .invoke('call')
  .series().toArray(function() {
    console.log(state)
  });

一方、このアプローチはより副作用があります。ストリーム内のものは、最終的に変換して利用するものではなくなりました。

最後に、最後に使用する必要.toArrayがあるのは奇妙に感じますが、それは単に.done(cb)ハイランドに追加するための議論にすぎません.

于 2014-11-22T00:14:36.237 に答える