2017-09-13 14 views
-2

私は2つの約束を持っています。 1つは解決されていないと私はなぜ知りません。私の約束が解決しないのはなぜですか?

processTradeOffer'プラン'と呼ばれるオブジェクトをproccedしようと約束のチェーン。 identifyOffer varを返します。"valida" | "受け入れ可能" | "denegable"。 'valida'の場合、オファーからアイテムを特定する必要があります。したがって、別の非同期関数が必要ですidentifyItems(offer)は返されますvar 'offerState' "denegable" | "受け入れられる"とし、私たちは申し出を拒否または受け入れることができます。

私は知っている問題は、ステートメント(offerState == 'valida')にありません。 コード:

const processTradeOffer = function(offer) { 
    return new Promise(function(resolve, reject) { 
     identyOffer(offer) 
      .then(function(offerState) { 
       return finishTradeOffer(offer, offerState); 
      }).then(function() { 
       console.log('aqui'); 
       return resolve(); 
      }) 
    }) 
} 
const finishTradeOffer = function(offer, offerState) { 

    return new Promise(function(resolve, reject) { 
     if (offerState == 'aceptable') { 
      acceptTradeOffer(offer).then(function() { 
       return resolve(); 
      }) 
     } else if (offerState == 'denegable') { 
      declineTradeOffer(offer).then(function() { 
       console.log('here'); 
       return resolve(); 
      }) 
     } else if (offerState == 'valida') { 
      identifyItems(offer).then(function(offerState) { 
       finishTradeOffer(offer, offerState); 
      }) 
     } 
    }) 
} 

はconsole.log( 'ここ')は正常に解雇とはconsole.log( 'AQUI')はいけませんさ。

+3

「新しいPromise()」を使用しないでください。 – SLaks

+0

'offerstate == 'valida''ならば何が起こるはずですか?ところで、 '.then(function(){return resolve();}'は 'then(resolve)'と同じですが、とにかくやってはいけません。 –

+0

あなたは 'then()'を呼び出しているので、 'identyOffer'、' acceptTradeOffer'などはすでに約束を返しています。そうですか? –

答えて

1

まず、Promise constructor antipatternの使用を避けてください。あなたの機能はすでに約束を返す。

catchコールバックを追加して、考えられるエラーを処理します。

const processTradeOffer = function(offer) { 
    return identyOffer(offer) 
    .then(function(offerState) { 
     return finishTradeOffer(offer, offerState); 
    }) 
    .then(function() { 
     console.log('aqui'); 
    }) 
    .catch(err => console.log(err)); 
} 

const finishTradeOffer = function(offer, offerState) { 
    switch (offerState) { 
    case 'aceptable': 
     return acceptTradeOffer(offer); 
    case 'denegable': 
     return declineTradeOffer(offer); 
    case 'valida': 
     return identifyItems(offer) 
     .then(function(offerState) { 
      return finishTradeOffer(offer, offerState); 
     }); 
    default: 
     return Promise.resolve(); 
} 
+0

'processTradeOffer'によって返される約束の価値は、' finishTradeOffer'の呼び出しからの返り値の代わりに 'undefined'になる' console.log'の戻り値になるので、これについてあまり感動しません'、これは望むものである可能性が非常に高いです。そして、拒否は 'catch 'によって捕まえられ、' console.log(err) 'の値で再び成功します。これはあなたの望むものではないでしょう。 –

+0

これは私にとって最高の解決策です。私は間違いなく約束についてもっと読む必要があります。もう一つの質問:acceptTradeOfferとdeclineTradeOferrは非同期関数であり、失敗する可能性があります。その場合、エラーはキャッチされますか? –

+0

@torazaburo私は 'processTradeOffer'が' undefined'値を持つ約束を返しますが、OPコードだと同意します。おそらく彼はこの結果を使用しません。なぜ、_console.log( 'aqui'); _が呼び出されないのかという疑問がありました。私はその理由を説明しようとしました。 'catch'ブロックについては、私は再び' processTradeOffer'関数がどのように使われているのかわかりません。それが独立して呼び出された場合、この 'catch 'は有効です。 – alexmac

2

問題は、このブロックであることである:

} else if (offerState == 'valida') { 
     identifyItems(offer).then(function(offerState) { 
      finishTradeOffer(offer, offerState); 
     }) 
    } 

あなたはとても機能はとてもコールバックのいずれかを呼び出さずにフォールスルーresolve()またはreject()のいずれかを呼び出していない、最終的には、「AQUI」ブロックが呼び出されることは決してありません。

+0

@trincot約束が 'then'コールバック関数を実行させるために' resolve'を呼び出さなければなりません。 – 4castle

+0

私は2つの機能の間の依存関係を見逃しました。 – trincot

+0

いいえ。私はofferState = 'aceptable'または 'denegable'まで同じ約束をしています。それは大丈夫ですか? –

1

コードを次のように記述してください。

const processTradeOffer = function(offer) { 
    const result = identyOffer(offer) 
    .then(offerState => finishTradeOffer(offer, offerState)) 

    result.then(() => console.log('aqui')); 

    return result; 
}; 

const finishTradeOffer = function(offer, offerState) { 
    switch(offerState) { 
    case 'aceptable': return acceptTradeOffer(offer); 

    case 'denegable': { 
     const result = declineTradeOffer(offer); 
     result.then(() => console.log('here')); 
     return result; 

    case 'valida': 
     return identifyItems(offer) 
     .then(offerstate => finishTradeOffer(offer, offerState)); 

    default: 
     throw "Invalid value for offerstate!!"; 
    } 
}; 

基本的なポイントは、約束が解決されるようにvalidaのケースを処理することです。さらに、「明白な約束のコンストラクタ」を取り除いています。

関連する問題