【问题标题】:How to block for a javascript promise and return the resolved result? [duplicate]如何阻止 javascript 承诺并返回已解决的结果? [复制]
【发布时间】:2015-06-09 01:00:31
【问题描述】:

我显然误解了 js 承诺的解决方式或“返回”的语义。

我被一个期望我同步的函数调用——返回一个值。计算该值需要一些异步代码(特别是 dstore Collection 上的 ForEach 方法

我要完成的工作大致是这样,但这不起作用,因为函数 mySynchronousFunction 没有返回值。

function mySynchronousFunction() {
   var accumulator = {};
   var myPromise = doAsynchronousThingThatSideEffectsAccumulator();
   // Now my caller is expecting the value of accumulator.
   myPromise.then(function() {return accumulator;})
}

我知道 JS 必须允许单线程实现,所以阻塞并不酷,但必须有一些模式可以将异步代码与同步代码粘合在一起,我刚刚错过了。

【问题讨论】:

  • 这不是关于允许单线程实现 - 所有实现都必须是单线程的。
  • @meagar 这不是真的 - 没有说所有实现都是单线程的 - 例如 Java 中的 Rhino。
  • 无法添加答案,但这对我有帮助:tivix.com/blog/making-promises-in-a-synchronous-manner
  • 听起来await会解决这个问题,即return await myPromise

标签: javascript asynchronous promise deferred


【解决方案1】:

您不能从 Javascript 中的异步操作中生成同步结果。你就是做不到。如果您的操作的任何部分是异步的,那么整个结果必须是异步的,并且您必须使用回调、promise 或其他类似机制在操作完成并且结果准备好时进行通信。

如果您的异步操作已经返回了一个 Promise(它看起来像),那么您应该从包装函数中返回它:

function myWrapperFunction() {
   var accumulator = {};
   var myPromise = doAsynchronousThingThatSideEffectsAccumulator(accumulator);
   // Now my caller is expecting the value of accumulator.
   return myPromise.then(function(result) {
       // operate on the accumulator object using the async result
       return accumulator;
   })
}

myWrapperFunction.then(function(accumulator) {
   // write your code here that uses the accumulator result
});

您可能还需要注意,通过副作用操作的函数很少是最佳设计模式。您也可以传入输入并让它通过已解决的承诺返回输出并完全避免副作用。

【讨论】:

    【解决方案2】:

    不,没有办法使异步代码同步。一旦进行了异步调用,就必须一直异步处理结果。

    JavaScript 是单线程的,所以如果你创建一个等待结果的阻塞循环,那么处理结果的代码将没有机会运行。

    如果你想从一个异步函数返回一些东西,你必须返回一个调用代码可以用来异步处理结果的promise。

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2021-06-21
      • 2019-10-10
      • 1970-01-01
      相关资源
      最近更新 更多