2016-11-10 65 views
4

我還在學習的角度觀察到的2,和一直無法弄清楚如何我的代碼轉換成角1角2在角1轉換承諾觀察到在角2

function promiseFunc() { 
    var deferred = $q.defer();  

    $http.post(url, something) 
    .then(function (response) { 
     if (response === 1) deferred.resolve(response.data); 
     else deferred.reject(); 
    }).catch(function (e) { 
     deferred.reject(e); 
    }); 

    return deferred.promise; 
}  

任何人都可以告訴我如何我可以轉換此代碼角2可觀察?

編輯:

而且如果http.post是可選的什麼?

function promiseFunc(param1) { 
    var deferred = $q.defer();  

    if (param1 === 1) { 
    deferred.resolve(1); 
    } else { 
    $http.post(url, something) 
     .then(function (response) { 
     if (response.x === 1) deferred.resolve(response); 
     else deferred.reject(); 
     }).catch(function (e) { 
     deferred.reject(e); 
     }); 
    } 

    return deferred.promise; 
} 

我在可觀察到的是缺少的是調用解析和拒絕的能力。它能以可觀察的方式完成嗎?

+0

的問題是,你是依靠[遞延反模式](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns #延遲反模式),這不是Promise/A +固有的,並且不能直接轉化爲觀測值(他們不會將它稱爲反模式)。 – estus

回答

3
someMethod() { 
    if(param === 1) { 
    return Observable.of(1); 
    } else { 
    return this.http.post(url, something) 
    .map(
     response => { 
     let data = response.json(); 
     if(data === 1) { 
     return 1; 
     } 
     throw 'some error'; 
     } 
    ); 
    } 
} 

然後使用它像

this.someMethod().subscribe(
    data => console.log(data), 
    error => console.log(error), 
() => console.log('completed') 
);  
+0

如果http.post是可選的,該怎麼辦?你能檢查我的編輯嗎? – Reynaldi