如何阻止 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 一个调用代码可以用来异步处理结果的承诺。
我显然误解了 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 一个调用代码可以用来异步处理结果的承诺。