2017-08-05 5 views
1

私はPromiseの最適な実装に興味があり、ブール値の結果を与えることを意図しています。私の質問は、Promises/A+のようにthenの論理的に等価なものを含む約束/先物の実装を考慮します。 私の質問です:そのような約束resolveは結果が何であれ、それはresolvetruerejectの上にfalseに何かをする必要がありますか? ES6のようにJavaScriptでこのようにブール戻り値を持つ約束を使用する

class Named { 
    constructor(name) { 
     this.name = name; 
    } 
    // always resolve 
    isFoo1() { 
     return new Promise(resolve => { 
     resolve(this.name === 'Foo'); 
     }); 
    } 
    // resolve or reject 
    isFoo2() { 
     return new Promise((resolve, reject) => { 
      if (this.name === 'Foo') { 
       return resolve(true); 
      } 
      reject(new Error('Not Foo!')); 
     }); 
    } 
} 

今、あなたが行うことができます:

const namedObjects = [new Named('Foo'), new Named('FooBar'), new Named('Foo')]; 
const nameChecks = namedObjects.map(obj => obj.isFoo1()); 
const checkNames =() => namedObjects.map(obj => obj.isFoo2()); 

// using always resolve 
Promise.all(nameChecks) 
    .then(results => { 
     if(results.every(v => v)) { 
      return alert('all is foo!'); 
     } 
     alert('all is not foo!'); 
    }); 

// using resolve or reject 
Promise.all(checkNames()) 
    .then(() => alert('all is foo!')) 
    .catch(() => alert('all is not foo!')); 

私は「解決または拒否」バージョンはPromiseコンセプトをより自然に動作することを主張するだろう - に特にBluebirdのような拡張された実装を使用します。

+0

プロミスは、アプリケーション*に適した*を使用して解決できます。オブジェクト、数字、文字列、何でも。 – Pointy

+0

両方のバージョンがboolで解決されることに注意してください。問題は解決すべき問題ではありません。しかし、boolをマップして_and_ rejectまたはboolを解決するかどうか。 –

+0

申し訳ありませんが、質問はまだ意味をなさない。 – Pointy

答えて

0

プロミスの解像度値をその状態にコンバートしたくありません。たとえば、XHRクエリの結果がfalseであるとします。拒否されたという意味ですか、または照会された値は実際にはfalseですか?

+0

エラーがあった場合(この場合は名前にアクセスしようとしている場合)に限り、拒否と言っていますか?したがって、version1の論争? –

+0

@BM、はい、エラーには拒否を使用する必要があります。特別なケースをエラーとして処理する人がいます(エラーが見つからないなど)。私の指摘は、有望なユースケースではなく、約束した実装の一般的な観察に過ぎませんでした。約束は、拒絶と遂行の両方の状態のために、遂行しているハンドラに依存するだけではありません。彼らはそれぞれにそれぞれの方法で状態に対処することによって、両方を可能にするべきです。 – MinusFour

+0

"あなたはエラーのために拒絶を使用するべきです"という意味ならば、私の理解に従うことは有望なユースケースに影響を与えるでしょう。具体的には、isFoo1を使用する必要があります。 –

関連する問題