【发布时间】:2013-05-01 03:08:19
【问题描述】:
我有一个承诺,我在我的 UI 中绑定。当 promise 解决并且 UI 元素呈现时,我可以单击该 UI 元素。在我处理点击的控制器代码中,我想对承诺的价值采取行动。此时在我的角度代码中,我已经知道承诺已解决..但是当我想获得价值时,它仍然是一个承诺。
什么是获得承诺价值的最佳方式...鉴于我知道它一定已经解决了?
【问题讨论】:
标签: angularjs
我有一个承诺,我在我的 UI 中绑定。当 promise 解决并且 UI 元素呈现时,我可以单击该 UI 元素。在我处理点击的控制器代码中,我想对承诺的价值采取行动。此时在我的角度代码中,我已经知道承诺已解决..但是当我想获得价值时,它仍然是一个承诺。
什么是获得承诺价值的最佳方式...鉴于我知道它一定已经解决了?
【问题讨论】:
标签: angularjs
承诺永远是承诺 - 这就是他们应该的样子。虽然可以将 Promise 直接绑定到视图,但我通常不鼓励这种做法,因为它缺乏透明度并且可能导致视图闪烁。更好的解决方案是在then 调用中分配范围值:
myService.then(function( val ) {
$scope.val = val;
});
当$scope.val 准备就绪时,它总是可以直接被视为一个值——因为它是。
也就是说,如果你想直接做promise赋值,你只需要把它当作一个promise;也就是说,您需要拨打promise.then(function () { ... });。这似乎是一种不便,但它实际上证明了 Promise 的强大。
如果你想了解更多关于 Promise 的信息,我在最近的一次 Google+ Hangout 中介绍了它们(并提供了代码示例),其中我介绍了 AngularJS 中 Promise 的优点、常见用途和最佳实践:AngularJS Hangout -- Promises, Promises Promises, Promises。永无止境的承诺链的想法得到了特别的解决,尽管我没有想到一个时间码。
希望这会有所帮助!
【讨论】:
难以理解的是,您可能会认为如果 Promise 尚未完全填充,那么如果我稍等片刻,我可以再次测试以查看它现在是否有价值。但这是不可能的,因为正如 MDN 上所解释的那样:
“在 JavaScript 事件循环的当前运行完成之前,永远不会调用回调。”
所以只要你当前启动的函数正在运行,Promise 就不能被完全填充。在事件循环的当前运行期间,它没有“价值”。 “Promise”的意思是“我保证可能会在 NEXT 事件循环运行期间给你”。
您可以将该承诺保存到一个全局变量中,然后当用户单击浏览器中的一个按钮时,一个新的事件循环会通过运行您的事件处理程序来启动,该处理程序可以将另一个“when()”放到承诺上,这样如果到那时承诺已解决,则新的 when 函数将其获取的值作为参数并将其保存到您可以从中读取它的变量中。无需将其写入控制台,即可查看它是否存在。
这对我来说是一个棘手的部分,我想是的,我确信我可以让 Promise 写入控制台,但我不能从控制台读取,那么我怎样才能将这个值放入我的程序的其余部分?答:等到当前的事件循环结束,就可以了。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises
【讨论】: