内部から約束を拒否し、機能する方法


85

これはおそらくばかげた質問ですが、プロミスチェーンの途中で、当時の関数の1つからプロミスを拒否するにはどうすればよいですか?例えば:

someActionThatReturnsAPromise()
    .then(function(resource) {
        return modifyResource(resource)
    })
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource)) {
            var validationError = getValidationError(modifiedResource);
            // fail promise with validationError
        }
    })
    .catch(function() {
        // oh noes
    });

元の解決/拒否関数またはPromiseResolverへの参照はなくなりました。追加するだけreturn Promise.reject(validationError);ですか?


1
throw validationError
kavun 2014年

> <それはばかげた/簡単なことだろうと感じました。代わりに、専用の拒否関数を呼び出すか、失敗したPromiseを返す必要があると考え続けたと思います。したがって、promise / thenableの内部から、新しいPromiseではない戻り値は解決された値と見なされますか?そして、エラーをスローした場合、それはすぐに拒否されたPromiseを返すことと同じですか?あなたが答えとしてそれを投稿するならば、私はそれを受け入れます。
チャイナビュッフェ2014年

おそらく、ここでは受け入れ答えを探しているstackoverflow.com/questions/17800176/...
CRAD

回答:


96

追加するだけreturn Promise.reject(validationError);ですか?

はい。ただし、jQueryでのみ複雑であり、Promise / A +準拠のライブラリを使用すると簡単に実行できます。

throw validationError;

したがって、コードは次のようになります。

someActionThatReturnsAPromise()
    .then(modifyResource)
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource))
            throw getValidationError(modifiedResource);
        // else !
        return modifiedResource;
    })
    .catch(function() {
        // oh noes
    });

3
これは定期的に行うことですか?広く使われていますか?コードのどこか.catchが欠落していると、アプリ全体が停止しないエラーで爆発するため、私はそれを行うのが悪いと感じています。–
Andrey Popov

3
Promise / A +準拠のライブラリhandlerthenは、forが同期されており、例外をキャッチできるため、throwを使用できることに注意してください。ハンドラーが非同期の場合、最終的に拒否する約束を返す必要があります。したがって、スローする代わりに常にPromise.reject()を返すことは私には理にかなっています。非同期ハンドラーをスローすると、ライブラリはそれをキャッチできず、サイレントに渡されるためです。注意してください。
マイクグリーソンジュニアクチュリエ2015年

1
@MikeGleasonjrCouturier:promiseのハンドラーではない非同期ハンドラーがあってはなりません.then:-)約束されていないAPIを使用している場合でも、return Promise.reject()役に立ちます。
ベルギ2015年

@Bergi私は次のように意味しました:p.then(function() { doAsync(function() { throw new Error("won't catch"); }); }); 編集:ああ、私はあなたのコメントを読み直しました、私は完全にあなたと一緒です、私たちは同じページにいます!私はそれをOPに指摘したかった:)
マイクグリーソンジュニアクチュリエ2015年

1
@MikeGleasonjrCouturier:はい、まさにそれが私が言っていたことです。そして、doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })そこでも機能しません-それはただ静かに失敗します。それは本当にdoAsync().then(function() { throw new Error("will be caught"); })あなたが約束を扱っているときであるべきです。
ベルギ2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.