Вернуть вложенное обещание в родительскую функцию

В большинстве руководств по angularjs я видел, как цепочки обещаний приводят к изменению переменной области видимости.

$http.get(someURL).then(function (value) {
    $scope.someValue = value;
});

Можно ли вернуть это значение родительской функции? Когда-либо метод, который я пробовал, просто возвращает другое обещание.

$scope.test = function(){
    return $http.get(someURL).then(function (value) {
        return value;
    });
};

$scope.test = function(){
    var deferred = $q.defer();
    $http.get(someURL).then(function (value) {
        deferred.resolve(value);
    });
  return deferred.promise;
}

Я не хочу связывать еще одно обещание, просто верните json, чтобы я мог сделать что-то вроде этого:

<button ng-click='some_vars = test()'>Get ajax</button>
<ul ng-repeat='var in some_vars'>
    <li>{{var.title}}</li>
</ul>

person Bill Johnston    schedule 17.10.2014    source источник
comment
Нет, потому что вы не можете вернуться из вызова AN AJAX — вы все равно можете установить переменную области для результата вызова AJAX, и представление будет автоматически обновляться.   -  person tymeJV    schedule 17.10.2014
comment
@tymeJV это неправда, зависит от версии, которую использует OP, развертка промисов устарела, и я бы никогда никому не посоветовал это делать, но в Anular 1.2 все еще можно изменить настройки $parseProvider, например: $parseProvider.unwrapPromises(true);   -  person Josep    schedule 18.10.2014
comment
встраивание отсрочки внутри обещания является антишаблоном github.com/petkaantonov/bluebird/wiki /Promise-anti-patterns я знаю, что это на стороне сервера, но вы можете взять его за ссылку   -  person pedrommuller    schedule 18.10.2014


Ответы (1)


ИМО, вот как вы должны это сделать:

В вашем контроллере сделайте следующее:

$scope.some_vars=[];
$scope.loadVars = function(){
    $http.get(someURL).success(function (data) {
        $scope.some_vars=data;
    });
};

На ваш взгляд, сделайте следующее:

<button ng-click='loadVars()'>Get ajax</button>
<ul ng-if="some_vars.length>0" ng-repeat='var in some_vars'>
    <li>{{var.title}}</li>
</ul>

Гораздо проще, правда?

Однако, если вы используете версию Angular до 1.2.0-rc.3. и вы действительно хотите автоматически разворачивать промисы (я бы настоятельно не советовал вам этого ), вам нужно будет изменить настройки $parseProvider в конфигурации вашего модуля, например:

.config(function($parseProvider){
  $parseProvider.unwrapPromises(true);
})

Пример работы

Развертка промисов была удалена в версии 1.2 и полностью устарела в версии 1.2.0-rc.3.

Вы можете ознакомиться с этим документом: Миграция с предыдущих версий.

$parse: из-за fa6e411d распаковка промисов удалена. Он устарел с версии 1.2.0-rc.3. Его больше нельзя включить. Два метода были удалены:

     $parseProvider.unwrapPromises 

     $parseProvider.logPromiseWarnings
person Josep    schedule 17.10.2014
comment
Я понимаю, что вы можете сделать это таким образом, но действительно НЕВОЗМОЖНО просто вернуть значение? Я хочу избежать создания множества различных функций, которые контролируют, как обновлять область действия, предпочитаю просто делать это в html. - person Bill Johnston; 18.10.2014
comment
@BillJohnston нет, это не невозможно, я обновлю свой ответ через секунду, но я бы посоветовал вам этого не делать. - person Josep; 18.10.2014
comment
@BillJohnston Я обновил свой ответ, пожалуйста, взгляните на него, спасибо! - person Josep; 18.10.2014