Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度模板能否调用函数返回承诺_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript 角度模板能否调用函数返回承诺

Javascript 角度模板能否调用函数返回承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,表示“$q承诺由angular中的模板引擎识别,这意味着在模板中,可以将附加到作用域的承诺视为结果值。” Angular的视图模板还允许您计算表达式,这意味着您可以调用从作用域公开的函数 我发现视图模板能够引用实值、承诺(最终解析为实值)或返回实值的函数,但不能引用返回承诺的函数,这些函数总是将{}呈现到视图模板中 我创造了 谁能做得更好,或者把我引向正确的方向 (也许在视图模板中使用函数是个坏主意;这种技术还存在其他问题,因为在不调用函数的情况下,观察函数无法判断它是否已更改,因此在每个摘要周

表示“$q承诺由angular中的模板引擎识别,这意味着在模板中,可以将附加到作用域的承诺视为结果值。”

Angular的视图模板还允许您计算表达式,这意味着您可以调用从作用域公开的函数

我发现视图模板能够引用实值、承诺(最终解析为实值)或返回实值的函数,但不能引用返回承诺的函数,这些函数总是将
{}
呈现到视图模板中

我创造了

谁能做得更好,或者把我引向正确的方向


(也许在视图模板中使用函数是个坏主意;这种技术还存在其他问题,因为在不调用函数的情况下,观察函数无法判断它是否已更改,因此在每个摘要周期中都会对所观察的函数进行评估。我已经看到了这些,在这两种方法中,建议使用promise。然后更改作用域上的普通属性,并让视图模板监视普通属性而不是承诺。我明白了,但出于我的使用,我想提供一些参数来计算值,并且直接在视图模板中提供这些参数很方便。基本上,我试着在或中编写类似url_的内容。)承诺表示未来值,通常是异步操作的未来结果,允许我们定义一旦该值可用或出现错误时将发生什么

参考

var promise = asyncFunction(parameters); 

promise.then( 
 function (result) { 
 // Do Something with the result 
 }, 
 function (error) { 
 // Handle error (exception, etc). 
 }); 
您可以使用实用程序方法
$q.when()
将任何值包装为承诺

  • $q.when(承诺)→ 允诺
  • $q.when(不妥协)→ 一个新的承诺,那将
  • 异步解析为给定的值
=====================================

在您的示例中:

HTML


Demo

我不太确定,但如果您返回一个带有promise作为属性的对象,它就会工作

HTML:

函数返回承诺(对象):{{getPo().promise}


谢谢,但这并不能回答我的问题(或者与我之前链接的问题的答案相同)。您不再从模板调用函数,因此,例如,如果getProperty()接受参数,我无法从模板中提供它们。(我同意您的解决方案是有效的,考虑到手表在每个摘要周期中评估手表表达式中函数的方式,也许最好避免在视图模板中使用函数调用。但是,我想了解为什么Angular可以在模板表达式中处理函数调用和承诺,但不能同时处理。)一般来说,我会将
promise
逻辑投入服务(Singleton)并将其用作实用工具Angular>=1.2.0中的承诺自动展开不再有效-请参阅中的讨论,是的,对我来说很有效。当我有更多时间时,我将尝试深入源代码,找出原因,以及是否是值得报告的错误,即从函数返回的原始承诺不起作用。不过,这是一个有用的技巧。
<div ng-app ng-controller="testController">
    <p>Direct property: {{ property }}</p>
    <p>Function returning property: {{ getProperty() }}</p>
    <p>Direct promise: {{ promise }}</p>
    <p>Function returning promise: {{ out }}</p>
</div>
function testController($scope, $q) {
    var deferred = $q.defer();
    deferred.resolve('some lazy text');
    $scope.promise = deferred.promise;

    $scope.out = $scope.promise.then(function (result) {
        console.log(result);
        return result;
    });


    $scope.property = 'some text';
    $scope.getProperty = function () {
        return $scope.property;
    };
}
var deferred2 = $q.defer();
$scope.po = { promise: deferred2.promise };
$scope.getPo = function() {
    return $scope.po;
};

$timeout(function() {
    deferred2.resolve('some lazy text');
}, 2000);
<p>Function returning promise (object): {{ getPo().promise }}</p>