2013-08-14 17 views
7

サーバー側でリクエストが失敗することがわかったら、約束をシミュレートする方法を知りました。ここに私のコードです:AngularJS Promises - http約束をシミュレート

if (!ng.isString(email)) { 
    var promise = $q.defer().promise; 
    $q.reject(); 

    return promise; 
} 

return $http({ 
     method : "PUT", 
     url : "//localhost/update" , 
     data : { data: email } 
}) 

// Success handler 
.success(response){ return response}) 

// Error handler 
.error(errorMsg){ return errorMsg}); 
+1

)(promise.reject()ではなく$のq.rejectを行います。 –

+0

次のエラーが表示されます。 オブジェクト#には「拒否」メソッドがありません – Frank6

+0

isStringのチェックは、後で$ http関数と関係がありますか?参照を簡略化してください。 – nXqd

答えて

5

私は、$ httpオブジェクトによって返された同じ約束をシミュレートする方法を理解できました。あなたの答えに感謝します。私はそれらをすべて考慮に入れることができました。ここに私のソリューションです:あなたの以下の提案(とAngularjsコードをデバッグ)と遊ぶ

if (!ng.isString(email)) { 

    // We need to create a promise like the one returned by the 
    // $http object (with the success and error methods) 
    // to stay consistent. 
    var promise = $q.reject("error with email"); 

    // Defining success and error method for callbacks. 
    // but it should never be called since the promise 
    // is already rejected. 
    promise.success = function(fn){ 
     promise.then(function(response){ 
      fn(response) 
     }, null); 
      return promise 
    }; 

    promise.error = function(fn){ 
     promise.then(null, function(response){ 
      fn(response) 
     }); 
     return promise; 
    }; 

    return promise; 
} 

return $http({ 
     method : "PUT", 
     url : "//localhost/update" , 
     data : { data: email } 
}) 

// Success handler 
.success(response){ return response}) 

// Error handler 
.error(errorMsg){ return errorMsg}); 
+1

' success'と 'error'メソッドがなぜ約束で定義されていないのか不思議です。それはあなたが思っていない便利なように思える? – Frank6

+1

私はこのようなことをする必要がありました。私の解決策は似ていますが、 'promise.then(function(response){fn(response);})'は 'promise.then(fn)'と事実上同じです。 –

0

あなたの構文がちょっと混乱しています。代わりにこれを試してみてください:

var deferred = $q.defer(); 
$q.reject(); 
return deferred.promise; 
+0

あなたの答えをありがとう!しかし、 'then'の代わりに' success'と 'error'メソッドを使う必要があるので、私は次のエラーを受け取ります:オブジェクト#にはメソッド 'success'がありません – Frank6

+0

HttpPromiseとPromise –

5

あなたが決意を使用して、データの流れを制御するために拒否することができます:

のは、あなたがこのようなサービスがあるとしましょう:

var app = angular.module("mymodule.services", []); 

app.factory("HttpRequest", ['$q', '$http', function(q, http) { 
    var deferredData = q.defer(); 

    http.get('http://your-server.local/data.json').success(function(data) { 
    //success, resolve your promise here 
    deferredData.resolve(data); 
    }).error(function(err) { 
    //error, use reject here 
    deferredData.reject(err); 
    }); 

    return { 
    get: function() { 
     return deferredData.promise; 
    } 
    }; 
}]); 

サービスは、その後することができ

var app = angular.module("mymodule.controllers", ['mymodule.services']); 

app.controller("MyCtrl", ['HttpRequest', '$scope', function(res, scope) { 
    //the "then"-method of promises takes two functions as arguments, a success and an erro callback 
    res.get().then(function(data) { 
    //first one is the success callback 
    scope.data = data; 
    }, 
    function(err) { 
    scope.err = err; 
    }); 
}]); 

2番目のコールバックでエラーを処理できます。このような

+0

あなたの答えをありがとう!良いですが、私は 'then'の代わりに' success'と 'error'メソッドを使用できるようにする必要があります – Frank6

+0

' $ q'ではangleで提供される約束事にそれらのメソッドはありません。ここ:http://stackoverflow.com/questions/17686612/rejecting-promises-with-multiple-arguments-like-http-in-angularjs/17687321#17687321 – Florian

1

何か作業をする必要があります:

if (!ng.isString(email)) 
    return $q.reject("Email is invalid."); // returns rejected promise 

return $http({ 
     method : "PUT", 
     url : "//localhost/update" , 
     data : { data: email } 
}); 

は、あなたのコード内で定期的に約束

mypromise.then(function(x) { do something with x.data }, function(error) { alert(error)}); 
+0

あなたの答えをありがとう!良いですが、私は 'then'の代わりに' success'と 'error'メソッドを使うことができるようにする必要があります。 – Frank6

3

$httpリターンangularJSでの約束としてそれを使用しています。あなたはjQueryのAJAX呼び出しに成功し、エラーの機能を探すことができるが、それはここangularJSで働く異なることだ

var promise = $http(...) ; 
promise.then(function(data) {}, function(error){}); 

:あなたはこのように行うことができます。正しく動作させるには、それに従う必要があるかもしれません。

成功とエラーを使用して、あなたのケースで動作させる方法を見つけることができる理由を、私たちにもっと教えてください。

1

、私は拒否または解決することができ、より簡単な方法を発見しました。

if (alreadyLoaded){ 
    var defered = $q.defer(); 
    defered.success = function(fn){ 
     defered.promise.then(fn); 
     return defered; 
    }; 
    defered.error = function(fn){ 
     defered.promise.then(null, fn);//or defered.promise.catch(fn) 
     return defered; 
    }; 
    if(data.invalid) 
     defered.reject("arbitrary error"); 
    else 
     defered.resolve(data); 
    return defered; 
}else { 
    return $http.get(...); 
} 

(両方successerror方法は待ち行列に入れられたコールバックを許可するようにthisを返す)

関連する問題