2016-06-15 13 views
1

私は約束を新たにしており、ネイティブプロミス(NodeJs)のベストプラクティスは不思議です。Javascriptの約束のベストプラクティス

私はより良い質問を理解するには、以下のいくつかのコードを置く:

Code_A

function foo(condition) { 
return new Promise((resolve, reject) => { 
if(condition){ 
    resolve('Promise result!'); 
} else { 
    reject('Promise rejected!'); 
} 
}); 
} 

をCode_B

約束を戻すために最良の選択肢である
function foo(condition) { 
return new Promise(() => { 
    if(condition){ 
    return Promise.resolve('Promise result!'); 
    } else { 
    return Promise.reject('Promise rejected!'); 
} 
}); 
} 

を?いくつかベストプラクティスのルールがありますか?

+3

後者は非常に間違っているようです。どうして 'if ... else'文を' foo'に直接入れないのですか?つまり、コールバックに 'resolve'と' reject'を使用していない場合、 'new Promise(...) 'をまったく使用する必要はありません。 –

答えて

3

いくつかのベストプラクティスルールがありますか?

すでにお持ちの場合は、約束をしないでください。

しかし、実際に2番目の例を試しましたか? Promiseはexecutorの戻り値を無視します(specを参照)。言い換えれば、約束は決して解決されることも、拒否されることもありません。

代わりに、あなたは

function foo(condition) { 
    if(condition){ 
    return Promise.resolve('Promise result!'); 
    } else { 
    return Promise.reject('Promise rejected!'); 
    } 
} 

を書くことができ、どの選択するには、これらの一つは、あなたのユースケースに依存します。結果をすでに知っている場合にのみ、この回答の例を使用することができます。しかし、非同期プロセスが関与し、結果がそのプロセスによって決定された場合、最初のフォームを使用する必要があります(そのプロセスを「待機」する必要があるため)。

2

私は最近、約束を抱いて自分自身に多くの問題を抱えていました。

最初のコードは正しいですが、2番目のコードは不要な余分なプロミスの解像度です。

約束については、あなたのコードに含まれるライブラリがそれらを返すようになると、本当に時代が来るということです。私は今日N​​PMからの「要求」ライブラリを使用するのであれば、私のようなコードを記述する必要があります。

function myRequestPromise(url){ 
    return new Promise((resolve,reject)=>{ 
     request(url,(err,res,body)=>{ 
      if(err) reject(err); 
      else resolve(body); 
     }) 
    }) 
} 

そして、あなたはあなたの中からあなたの約束を戻ってきている

myRequestPromise(url).then(doSomething).catch(errors); 

注意を行きます本当にコールバック。このラッパーは、それを呼び出すすべてのコードがPromisesを使用できることを保証します。したがって、あなたの 'ライブラリ/ヘルパー'コードは、そのような入れ子にされたコールバックが完全にPromisesに変換されていることを期待してください。将来的には

、あなたがいつか将来にRxJSのようなものを使用することを計画している場合、要求ライブラリの作者が約束にネイティブにそれを変更した場合、あなたはこれをさらに取る

request(url).then(doSomething).catch(errors)

を使用することができ、あなたが必要別の余分なレイヤーを追加する。しかし、いったん使用するライブラリがPromisesにアップグレードされると、Observablesにうまくいけば、非同期コードを書くほうがはるかに簡単になります。

+1

同じ著者からの約束があるリクエストライブラリがあることは知っていますか? https://www.npmjs.com/package/request-promise –

+0

いいえ、私は自分のコードでリクエストライブラリにこれを行なわなければなりませんでした - その場合の悪い例を残念に思う - 多くの非同期ライブラリが約束/ a +に準ずるものではありません。 – user6387024

+1

これはまだ素晴らしい例です)私はすでに約束を要求していることを伝えていましたが、青い鳥のような図書館もありますので、いくつかの図書館を宣伝することができます –