【问题标题】:How to get value of promise that already resolved?如何获得已经解决的承诺的价值?
【发布时间】:2013-05-01 03:08:19
【问题描述】:

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

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

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    承诺永远是承诺 - 这就是他们应该的样子。虽然可以将 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。永无止境的承诺链的想法得到了特别的解决,尽管我没有想到一个时间码。

    希望这会有所帮助!

    【讨论】:

    • 谢谢!我接受了您的建议,并在“then”函数中分配了我的范围变量。从那里一切顺利。但我很好奇是否存在直接绑定到 Promise 的特定情况......因为 Angular 提供了这个功能。
    • 我不知道有任何此类情况;我认为提供该功能主要是为了方便。但也许其他人有意见......
    • 给出“你不想这样做”的答案并不总是有帮助的。在我的情况下,我肯定想在调试时这样做,但我不知道如何获得承诺的价值。这肯定是有可能的。
    • @Mashisuji 但我确实告诉过你如何获得承诺的价值。对于调试,为什么需要在视图中而不是调试控制台中呢?你有一个笨蛋吗?
    • 这里的便利是由Angular提供的,因为当promise被解析时,它被返回到$scope.val,因此在UI处绑定到模型。但是,还有许多其他情况,例如当框架为您提供不接受承诺的功能时。例如。 myFrameworkFunction(){ 返回一个值;}。如果您在那里返回 deferred.promise,将显示的值将是 [Object object]。那是我们需要像 defer.promise.value(); 这样的东西的时候。 ,目前 $q 不提供。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2022-12-17
      • 2013-05-15
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多