2014-10-17 2 views
1

В большинстве обучающих программ 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> 
+1

Нет, потому что вы не можете вернуться из вызова AJAX - вы можете установить переменную области видимости в результате вызова AJAX и вид будет автоматически обновлять. – tymeJV

+0

@tymeJV это не так, зависит от версии, которую использует OP, обещание разворачивания устарело, и я никогда не советую кому-либо это делать, но в Anular 1.2 все еще можно изменить настройки '$ parseProvider', например: '$ parseProvider.unwrapPromises (true);' – Josep

+0

встроить отложенный вклад в обещание - это antipattern https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns, я знаю, что это на стороне сервера, но вы можете считать это ссылкой –

ответ

3

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

В контроллер сделать это:

$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); 
}) 

Working Example

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

Возможно, вы захотите ознакомиться с этим документом: Migrating from Previous Versions.

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

 $parseProvider.unwrapPromises 

    $parseProvider.logPromiseWarnings 
+0

. Я понимаю, что вы можете сделать это таким образом, но действительно НЕВОЗМОЖНО просто вернуть значение? Я хочу избежать необходимости создавать множество функций, которые контролируют, как обновлять область, предпочитают просто делать это в html. –

+0

@BillJohnston нет, это не невозможно, я обновляю свой ответ за секунду, но я бы посоветовал вам это сделать. – Josep

+0

@BillJohnston Я обновил свой ответ, пожалуйста, взгляните на него, спасибо! – Josep

Смежные вопросы