4

条件付きで非同期関数を実行したいのですが、必要なことを伝える正しい構文が不足していると思います。

this.doUpToThreeThings = function(skipTheMiddleStep) {
    return doFirstThing().then(function (result) {
        if (skipTheMiddleStep) {
            return doThirdThing();
        } else {
            return doSecondThing();
        }
    }).then(function (result) {
        if (skipTheMiddleStep) {
            return "ok"; // return what?
        } else {
            return doThirdThing();
        }
    });
}

2 番目のブロックに到達するまでに、最初のブロックが中間のステップを実行したかどうかがわからないため、条件を繰り返さざるを得なくなります。そして、2 番目のブロックの読み方は奇妙です: 中間のステップを飛ばして 3 番目のことを行うと言うべきですが、前のブロックが 3 番目のことを行ったに違いないことがわかっているので、単に戻ります。そのため、この条件を繰り返して、2 番目に見栄えの悪いコードを書かなければなりません。

doSecondAndThirdThings という関数を記述して、最初のブロックの条件から呼び出すことができることに気付きましたが、それは実際には DRY ではなく、非 DRY 性を隠しているだけです。(それとも私が間違っているのでしょうか?)

また、その「ok」ブランチで完了した約束を返すことについて、私はまだ少し混乱しています。そうですか、決意というか。 - ありがとう

4

1 に答える 1

7

thefourthey の回答の deferred は無意味であり、約束のあるアンチ パターンと見なされます。

これが私がそれを行う方法です:

this.doUpToThreeThings = function(skipTheMiddleStep) {
    return doFirstThing().then(function (result) {
        return (skipTheMiddleStep) ? doThirdThing() : doSecondThing().then(doThirdThing);
    });
}
于 2014-03-23T18:58:25.907 に答える