2014-06-10 2 views
1

나는 체인 아래쪽으로 $http을 호출하고 결과 핸들을 다음 처리기로 전달해야하는 약속 체인을 가지고 있습니다. 문제는 내 .then() 성공 함수가 반환 된 $http 약속을 다른 약속으로 래핑하는 것으로 나타나 내 http 약속이 페이로드로 처리되는 결과를 초래합니다. 그래서 체인의 다음 링크에서 해결할 때 http 응답보다는 약속이 생깁니다.

var statusPromise = Auth.getUserStatus(); 

var tokenPromise = statusPromise.then(function(status) { 
    if (status && status.accesstoken) { 
     return status.accesstoken; 
    } else { 
     return null; 
    } 
}); 

var httpPromise = tokenPromise.then(function(accesstoken) { 
    console.log('access token', accesstoken); 
    var params = { 
     page: page, 
     limit: limit 
    }; 

    if (accesstoken) { 
     params.accesstoken = accesstoken; 
    } 

    return $http.get(apiUrl + 'scenes/' + filter + '/', { 
     data: $.param(params), 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
    }); 
}); 

var doMoreStuffPromise = httpPromise.then(function(response) { 
    console.log(response); // this logs the promise as the payload, not the http response 
    return response.data; 
}); 

return doMoreStuffPromise; 

내 체인에 $http 약속을 체인화하려면 어떻게해야합니까?

답변

1

문제점을 파악했습니다. 내가 예상했던 것보다 훨씬 더 체인에서 일어나고 있었다.

this.getUserStatus = function() { 
    $.when(...); // woops, no $q 
}; 

가되어 있어야합니다 :

실수로 $q를 잊어 $.when() 이후 약속을 만들기위한 합법적 인 jQuery를 기능입니다
this.getUserStatus = function() { 
    $q.when(...); 
}; 

, 아무것도 크게 실패하지 않습니다 그것은 내 인증 서비스가 버그을 한 것으로 밝혀졌습니다. 그러나 앵귤러 및 jquery가 어떻게 작동하는지에 약간의 차이가 있기 때문에 언 랩핑 대신 다른 하나를 감 쌉니다.

+0

흥미 롭습니다. 나는 야생에서이 문제를 본 적이 없으며 순수하게 이론적 인 것으로 간주했다 :-) – Bergi

1

$http 호출은 약속을 반환하고, 재귀 적으로 동화를 약속합니다 ... 문제는 약속과 관련이 없습니다. 문제는 특히 $http API입니다. 사실, $ q와 같은 Promises/A + 구현이 unwables하지 않고 thenable을 반환하는 것은 불가능합니다. 당신이 (성공시) .then를 사용하는 경우

는 당신이 .success에서 떨어져 .success을 사용하는 경우 체인없는 것보다 다른 방식으로 작동, 그것은 resolves with .data :

코드는 동일한 작업을 수행해야합니다

var doMoreStuffPromise = httpPromise.then(function(rep) { 
    console.log(resp.data); // now, your actual data 
    return resp.data; 
}); 
+0

그게 내가 한 일이다. 필자는 내 경우에 콜백 변수에 '데이터'를 전달한 것으로 명명했다. 내가 제안한 것을하면,'resp'는 여전히 이전의'tokenPromise.then()'에 싸여있는 약속입니다. 또 다른 약속 안에있는 페이로드 (payload)로서의 약속. – Soviut

+0

덜 모호한 명명법을 사용하여 명확하게 설명하기 위해 코드를 업데이트했습니다. – Soviut

+0

내가 약속 한 것보다 약속/A + 구현에 대한 의견이 정확하기 때문에 나는이 대답을 upvoted. JQuery의 약속은 A +가 아니며 언 래핑되지 않으므로 매우 유사하게 보이지만 랩핑 된 동작입니다. – Soviut

관련 문제