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