2016-08-11 5 views
0

約束を返す関数が2つあり、エラーをキャッチするためにcatchステートメントを使用することで、より洗練されたものにしたいと考えています。約束を返す関数の呼び出しをより綺麗にする

私は正しい方法でそれをやっていると思いますが、コードは関数を正しい順序で非同期に呼び出します。

これらは私の呼び出しです:

// The text is hopefully the email address and the pin number 
fb.verifyEmailPin(text).then(function(reply){ 

    // Set the new state to 'get_city' 
    fb.setState(FB_ID).then(function(result){ 


    }).catch(function(v) { 
     // Rejection 
     // If there was an error then prompt the user to enter again 
    }); // setState 

}).catch(function(err){ 

});// verifyEmailPin 

そして、この実際の関数 - SETSTATEのために、私はまだverifyEmailPin関数のコードを書いていないが、それはの面でセット状態と同じ構造を次の解決または拒否を返す。

/* 
* Function : setState 
* Purpose : Set the state to what every is send in on the parameter 
*/ 
exports.setState = function(fbid,newstate){ 

    var success = 'Y'; 
    return new Promise((resolve, reject) => { 

    client.hmset(fbid, { 'state': newstate }); 

    // Check that we have set it ok 
    client.hmget(fbid,'state',function(err,reply){ 

     if (err || reply != newstate) { 
      return reject(err); 
     } 

     return resolve(success); 

    }); 


    }).catch(function(v) { 

    }); 

} 
+0

*「コードが非同期で正しい順序で関数を呼び出すん。」* - 。?。だから、問題が何であるかをあなたが質問をしているようには見えません – nnnnnn

答えて

2

最後に.catchを使用できます。そしてインデントを少なくするには.thenをチェーンすることができます。 の中で非同期なものを実行した場合、 -functionsは必ず約束を返します。そうでなければ、次のことはその完了を待たないでしょう。同期操作(例えばsomePromise.then(JSON.parse).then(...))には何の約束は必要ありません。ここ

が短い例です:あなたが並行して複数の非同期操作を実行すると、あなたがでPromise.allを使用することができます完了するためにそれらのすべてを待ちたい場合

function promiseTest(x) { 
    Promise.resolve(x).then(function(a) { // instead of Promise.resolve do something asynchronous, e.g. an ajax call that returns a promise 
     if (typeof x != "number") throw "NaN"; 
     return a*2; 
    }).then(function(a) { 
     console.log(a); 
    }).catch(function(err) { 
     console.error("error in promise:", err); 
    }) 
} 
promiseTest(1); //logs 2 to the console 
promiseTest("a"); // shows error message in the console 

約束の配列とそれを供給

Promise.all([doSomethingAsyncAndReturnPromise(), somethingElseAsync()]).then(function results) { 
    // results[0] contains the result from doSomethingAsyncAndReturnPromise 
    // results[1] contains the result from somethingElseAsync 
}); 
+0

チェーンtのような彼は私があなたが約束から抜け出すと感じる最大の利益です。コールバックは単一の同期制御フローに統合され、必要に応じてすべてのエラー処理を1か所で行うことができます。 – Squirrel

+0

私は 'promiseTest(1)'と 'promiseTest(" a ")も同様に並列に実行するのではなく、連鎖すればよいと思います。 – jib

+0

@jibそれは 'promiseTest'が約束を返さないので動作しません。また、複数の約束事を並行して行うこと(「Promise.all」は本当にきちんとしている)に間違っていることはありません。特に、決して互いに依存せず、他の約束事で起こっていることを妨げない場合です。これは実際にはオープンブラウザーのコンソールとテストの種類の例なので、関数を手動で呼び出すことができます。 – hsan

関連する問題