如何为javascript promise进行阻塞并返回解析结果

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

本文关键字:返回 结果 javascript promise      更新时间:2023-09-26

我显然误解了js promise的解析方式或"return"的语义

我被一个函数调用,该函数希望我是同步的——返回一个值。计算该值需要一些异步代码(特别是数据存储集合上的ForEach方法

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

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

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

您不能在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,调用代码可以使用该promise异步处理结果。