当前位置: 首页 > 知识库问答 >
问题:

如何阻止javascriptpromise并返回解析结果?[副本]

澹台新知
2023-03-14

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

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

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

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

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

共有2个答案

翟缪文
2023-03-14

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

JavaScript是单线程的,所以如果你做一个等待结果的阻塞循环,那么处理结果的代码就没有机会运行。

如果希望从异步函数返回某些内容,则必须返回一个promise,调用代码可以使用该promise异步处理结果。

云京
2023-03-14

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

如果您的异步操作已经返回了一个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返回输出,完全避免副作用。

 类似资料:
  • 我正在使用Spring Webflux和Spring Boot2,我的场景如下: 在返回之前,我如何将来自流量和正常产品列表的结果连接起来?没有反应控制器是可能的吗? 附言。我不想对从调用1获得的结果调用。block()和CompleteableFuture

  • 我用的是parse.com。每个包里面都有很多钻子,每个品类里面都有很多包。 我卡住了。然后(函数(result,result2,result3)在最后一行。promise可以有多个promise,它是可变的。有没有一种方法可以写出如下内容: 谢谢!

  • 本文向大家介绍动态webservice调用接口并读取解析返回结果,包括了动态webservice调用接口并读取解析返回结果的使用技巧和注意事项,需要的朋友参考一下 这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下。 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我正在为如何处理这个特殊案件而挣扎。我知道我可以通过链式回调来解决这个问题,但它看起来就像是promise的海报: 我有一个父方法,它需要按顺序执行三个异步操作(特别是从用户那里得到确认)。我们称它们为func1 func2和func3。现在,我可以让每一个都返回一个promise,并将其链接起来,这一切都非常有效。我遇到的问题是: func1需要设置一个状态,等待链的其余部分运行,然后取消设置该

  • 我有一个返回: 然后另一个用户这样使用它: 如何处理任何迭代中的失败情况? 我知道我可以使用,在这种情况下,错误结果将被忽略: 的迭代器根据成功状态具有0或1项,如果为0,将过滤掉它。 但是,我不想忽略错误,而是想让整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误)。 在Rust中如何最好地处理此问题?

  • 问题内容: 我目前正在执行以下语句 这花费了很长时间,我想看看它走了多远,所以我运行了它: 那没有及时返回任何东西,所以对于它,我做到了: 即使这样似乎也无限期地运行。我可以理解是否有数百万条记录需要count(*)花费很长时间,但是我不明白为什么考虑到我指定了nolock,选择前1条记录为什么不会立即返回。 以完全公开的名义,dps_san是通过链接服务器从odbc连接中拉出的视图。我认为这不会