2016-07-04 8 views
0

私は、約束したサーバーコールの動作を実装しようとしています。Javascript - 約束の後にリダイレクト

サーバーからの返信が「成功」の場合、「成功」ページにリダイレクトします。「失敗」の場合は「失敗」ページにリダイレクトします。

現時点では、レスポンスが待たれておらず、ブラウザがリダイレクトされています。より前にはが返されます。サーバからの応答がありますが、成功か失敗かは関係ありません。

私は間違っていますが、どうすれば解決できますか?ここで

は、私のコードの関連する部分である:

var ch_item; 
Payment.postInvoice(dataObj, $rootScope.usertoken).then(function(res){ 
    if (res.message === "success") { 
    setTimeout(function() { 
     var payment_details = res.data; 
     User.getUserById(res.data.stylist_uuid, res.data.customer_uuid).then(function (stylist) { 
     ch_item = TC_Service.getChatCredentials(stylistInfo.uid, $rootScope.userId, $rootScope.usertoken, dataObj.request_uuid); 
     openModelAlert("Thank you for your booking!"); 
     $location.path('/success'); 
     }); 
    }, 500); 
    } else { 
    setTimeout(function() { 
     openModal("Sorry, please come back later."); 
     $location.path('/failure'); 
    }, 500); 
    } 
    $modalInstance.dismiss('cancel'); 
    $location.path('/default'); 
}, function() { 
    console.log("Something went wrong with the payment, the response is: "+res.message); 
}); 

はみんな私を助けて:)約束を返すとき

V.

+0

「と私は、サーバーからの応答を取得する前にブラウザがリダイレクトされる」 ''「/デフォルト」にリダイレクトされていますか? '$ location.path( '/ default');の目的は何ですか? – guest271314

+0

2番目のコールバックは引数 'res'を使用しますが、現在は引数を受け取りません。 2番目のコールバックに 'err'という引数を実際に追加し、' res'の代わりにそれを使用するべきです。これらは引数の単なる名前なので、あなたが望むものを実際に使うことができます。しかし、慣例により、 'onRejected()'コールバックは 'err'という引数を取るべきです。 – fvgs

+0

回答がありますか?これが問題であれば、約束は機能しておらず、このコードはそれとは関係ありません。また、角度のsetTimeoutを使用しているときに角度で同期されない場合は、$ timeoutを使用することができます。 –

答えて

1

..お時間をいただき、ありがとうございます呼び出しが失敗したかどうかを判断するためにif/elseステートメントを入れる必要はありません。これはデフォルトのコールバックの一部です。

.then(
    function(response){ 
    //if success show the response in the log 
    console.log(response) 
    },function(error){ 
    //if error show the error message in the log 
    console.log('Error: ' + error.statusText); 
    } 
); 

上記の例のように、最初のコールバック関数は成功を処理し、2番目のコールバック関数はエラーを処理します。私はあなたがそれで作業できることを願っています。

EDIT

はこれにあなたのコードを修正してください:_ _

var ch_item; 

Payment.postInvoice(dataObj, $rootScope.usertoken).then(function(res){ 
     var payment_details = res.data; 
     User.getUserById(res.data.stylist_uuid, res.data.customer_uuid).then(function (stylist) { 
     ch_item = TC_Service.getChatCredentials(stylistInfo.uid, $rootScope.userId, $rootScope.usertoken, dataObj.request_uuid); 
     openModelAlert("Thank you for your booking!"); 
     $location.path('/success'); 
     }); 
    } 
}, 
function (err) { 
     console.log("Something went wrong with the payment, the response is: "+err.message); 
     openModal("Sorry, please come back later."); 
     $location.path('/failure'); 
    }); 
+0

ご返信ありがとうございます。 私は既定のコールバックを使用していますが、現在のフローでは失敗したセクションには入りません。それは 'if'節に入り、答えが返ってくるまで私はすでにデフォルトページにリダイレクトされていて、数秒後にあなたの予約をありがとう!現れる。 マルチスレッドのアプローチのようです。 私はフローを制御できるように約束を使用したいと思った..しかし、それは私のために動作しません.. –

+0

私は起こっている理由は、あなたの周りに500ミリ秒のタイムアウト機能があるという事実によると思う/ elseステートメント。したがって、 '$ modalInstance.dismiss( 'cancel')のコード。 $場所path( '/ default'); 'はタイムアウト関数ではないので実行を続けます。このコードを実行するまでにタイムアウトが完了し、if文の実行が開始されます。 –

+0

タイムアウト関数を削除するか、 '$ modalInstance.dismiss( 'cancel');を実行してください。 $ location.path( '/ default'); 'タイムアウト関数の一番下にあります。希望が役立ちます。 –