如何阻止 javascript Promise并返回已解决的结果?

IT技术 javascript asynchronous promise deferred
2021-03-12 02:42:50

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

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

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

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

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

2个回答

您不能从 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
});

您可能还想注意,通过副作用运行的函数很少是最好的设计模式。您也可以传入输入并让它通过已解决的Promise返回输出并完全避免副作用。

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

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

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