15

我有一个在我的 UI 中绑定的承诺。当 promise 解决并且 UI 元素呈现时,我可以单击该 UI 元素。在我处理点击的控制器代码中,我想对承诺的价值采取行动。此时在我的角度代码中,我已经知道承诺已解决..但是当我想获得价值时,它仍然是一个承诺。

什么是获得承诺价值的最佳方式......鉴于我知道它必须已经解决?

4

2 回答 2

21

承诺永远是承诺——它们应该是这样的。虽然可以将 Promise 直接绑定到视图,但我通常不鼓励这种做法,因为它缺乏透明度并且可能导致视图闪烁。更好的解决方案是在then调用中分配范围值:

myService.then(function( val ) {
  $scope.val = val;
});

$scope.val准备就绪时,它总是可以直接被视为一个值——因为它是。

也就是说,如果你想直接进行 Promise 赋值,你只需要把它当作一个 Promise;也就是说,您需要调用promise.then(function () { ... });. 这似乎是一种不便,但它实际上证明了 Promise 的强大。

如果你想了解更多关于 Promise 的信息,我在最近的一次 Google+ Hangout 中介绍了 Promise(并提供了代码示例),其中我介绍了 AngularJS 中 Promise 的优点、常见用途和最佳实践:AngularJS Hangout -- Promises, Promises Promises , 承诺。永无止境的承诺链的想法得到了特别的解决,尽管我没有想到一个时间码。

希望这可以帮助!

于 2013-05-01T04:31:03.180 回答
0

难以理解的是,您可能会认为如果 Promise 尚未完全填充,那么如果我稍等一下,我可以再次测试以查看它现在是否有价值。但这是不可能的,因为正如 MDN 上所解释的:

“在 JavaScript 事件循环的当前运行完成之前,永远不会调用回调。”

所以只要你当前启动的函数还在运行,Promise 就不能被填满。在事件循环的当前运行期间,它没有“价值”。“Promise”的意思是“我保证可能在 NEXT 事件循环运行期间给你”。

您可以将该承诺保存到全局变量中,然后当用户单击浏览器中的按钮时,一个新的事件循环会通过运行您的事件处理程序开始,该处理程序可以将另一个“when()”放到承诺上,这样如果承诺到那时,新的 when 函数将其获取的值作为参数解决,并将其保存到一个变量中,您可以从中读取它。无需将其写入控制台,即可查看它是否存在。

这对我来说是棘手的部分,我想是的,我可以肯定我可以让 Promise 写入控制台,但我不能从控制台读取,那么我怎样才能将这个值放入我的程序的其余部分?答:等到当前的事件循环结束,就可以了。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

于 2017-08-10T20:11:02.270 回答