gpt4 book ai didi

javascript - 如何合并来自不同 Promise 的参数?

转载 作者:行者123 更新时间:2023-12-01 00:41:25 25 4
gpt4 key购买 nike

这个问题应该很清楚:我想使用如下语句写入日志文件。您可以假设此语句位于按钮的单击处理程序内。该伪代码中嵌入了两个问题。

pLogInfo("local info").then(pauseUntilSettled).catch(err); // This is my goal

这是我的库函数(每个函数返回一个 Promise):

// Get info asynchronously from a server (simple, should work)
function pGetServerInfo()
{
// then value: "server info"
} // pGetServerInfo

// Write into a file asynchronously (simple, should work)
function pWriteFile(path,string)
{
// no then value
} // pWriteFile

// Write formatted info into a log file asynchronously
function pLogInfo(localInfo)
{
pGetServerInfo().then(p2);
} // pLogInfo

function p2(serverInfo)
{
// Should write "local info, server info"
// But where is the local info? It got lost.
return pWriteFile('log',localInfo+','+serverInfo);
} // p2

用法:

pLogInfo("local info").then(pauseUntilSettled).catch(err);

function pauseUntilSettled()
{
// How to wait before returning from
// the button click event handler?
} // pauseUntilSettled

于 2019 年 8 月 27 日添加:

我想到了这个常见问题的几种可能的解决方案:

  1. 将一个对象附加到链中的顶级函数之一 (p.data={})。您可以在对象中存储您希望的任何参数或回调,并在任何异步“then”代码中引用它们。这是有效的,因为作为对象父级的函数具有全局作用域。如果在现有 Promise 尚未解决的情况下触发同一线程的另一个顶级 Promise,则可能会失败,因为新的执行线程将共享并覆盖该对象。我已经成功地使用了这种方法,这是上述全局公式的变体,但它显然不安全。

  2. 创建一个闭包函数来传播异步线程。闭包函数包含其参数和引用的全局变量的快照。我还没有把这个想法付诸实践,但它似乎很合理。

  3. 创建一个新的 Promise,作为 Promise 线程的一部分或作为单独的助手,它使用对象而不是单个值调用其解析函数。使用该对象将多个值传播到每个“then”函数。我也没有实现这个想法。

我希望这些想法能够激励某人(包括我自己)提出解决方案,因为这是一个非常常见的问题,但不经常被讨论。

最佳答案

Satpal 对于 promise 给出了很好的答案。另一种选择是使用 RXJS 库并利用构建在 Promise 之上的可观察量。它们有一个 next()、error() 和complete() block ,其中代码仅在流中接收到值后才会执行。如果您想等待多个服务响应,您可以通过多种方式将流组合在一起。

我知道这不是您正在寻找的确切答案,但它是一个非常有用的库。这是文档。 https://rxjs-dev.firebaseapp.com/api/index/class/Observable

关于javascript - 如何合并来自不同 Promise 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57675645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com