如何阻止 javascript 承诺和 return 已解决的结果?

How to block for a javascript promise and return the resolved result?

我显然误解了 js 承诺的解决方式或 "return."

的语义

我正在被一个函数调用,该函数希望我同步 - return 一个值。计算该值需要一些异步代码(具体来说,dstore Collection

上的 ForEach 方法

我想要完成的大致是这个,但这不起作用,因为函数 mySynchronousFunction 没有 return 值。

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

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

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

如果您的异步操作已经 return 是一个承诺(看起来像),那么您应该 return 来自包装函数的承诺:

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
});

您可能还想注意到,通过副作用操作的函数很少是最佳设计模式。您也可以传入输入并通过已解决的承诺将其 return 输出并完全避免副作用。

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

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

如果您想 return 来自异步函数的东西,您必须 return 一个调用代码可以用来异步处理结果的承诺。