Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止javascript承诺并返回解析结果?_Javascript_Asynchronous_Promise_Deferred - Fatal编程技术网

如何阻止javascript承诺并返回解析结果?

如何阻止javascript承诺并返回解析结果?,javascript,asynchronous,promise,deferred,Javascript,Asynchronous,Promise,Deferred,我显然误解了js承诺的解决方式或“返回”的语义 我被一个期望我是同步的函数调用——返回一个值。计算该值需要一些异步代码(特别是 我试图实现的大致是这个,但这不起作用,因为函数mySynchronousFunction没有返回值 function mySynchronousFunction() { var accumulator = {}; var myPromise = doAsynchronousThingThatSideEffectsAccumulator(); // No

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

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

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

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

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

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

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

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

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

不,没有办法使异步代码同步。一旦您进行了异步调用,您就没有了o始终异步处理结果

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


如果要从异步函数返回某些内容,则必须返回调用代码可以用于异步处理结果的承诺。

这不是允许单线程实现-所有实现都必须是单线程的。@meagar这不是真的-没有任何东西说所有实现都是single线程-例如Java中的Rhino。无法添加答案,但这对我很有帮助:听起来
wait
可以解决这个问题,即
return wait myPromise