标签:deferred javascript asynchronous promise
参见英文答案 > How do I return the response from an asynchronous call? 35个
我显然误解了js promises的解决方式或者“return”的语义.
我被一个期望我同步的函数调用 – 返回一个值.计算该值需要一些异步代码(特别是dstore Collection上的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(它看起来像),那么您应该从包装器函数返回它:
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
});
您可能还需要注意,通过副作用运行的函数很少是最佳设计模式.您也可以传入输入并让它通过已解决的承诺返回输出并完全避免副作用.
标签:deferred,javascript,asynchronous,promise 来源: https://codeday.me/bug/20190919/1812342.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。