当前位置: 首页 > 面试题库 >

节点; Q承诺延迟

饶高雅
2023-03-14
问题内容

这是一些基于行为的简单问题,我在下面的示例中在节点上运行时注意到了这些行为:

Q('THING 1').then(console.log.bind(console));
console.log('THING 2');

输出为:

> "THING 2"
> "THING 1"

1)为什么要Q实现在立即对已知值运行回调之前等待?为什么不够Q智能,以至于第一行在第二行运行之前同步发布其输出?

2)什么是之间的时间流逝"THING 2""THING 1"被输出?它是单个进程滴答吗?

3)能否将绩效深深包裹在承诺中而产生绩效问题?例如,Q(Q(Q("THING 1")))即使可以有效地同步解决,它是否也要异步等待3倍的时间才能完成?


问题答案:

这实际上是有目的的。无论值是否已知,都必须保持一致。这样,只有一个评估顺序,您可以依赖以下事实:无论承诺是否已兑现,该顺序都是相同的。

同样,否则,将有可能编写代码来测试诺言是否已兑现,并且通过设计不应当知道并兑现诺言。

这几乎就像回调样式的代码一样:

function fun(args, callback) {

    if (!args) {
        process.nextTick(callback, 'error');
    }
    // ...
}

这样任何人都可以通过以下方式调用它:

fun(x, function (err) {
  // A
});
// B

可以确保A永远不会在B之前运行。

规格

看到承诺/ A +规范,该then方法部分中,点4:

onFulfilledonRejected在执行上下文堆栈仅包含平台代码之前不得调用。

另请参见注释1:

这里的“平台代码”是指引擎,环境和承诺实现代码。实际上,此要求可确保在调用之后的事件循环之后以及使用新堆栈时,onFulfilled和onRejected异步执行。这可以通过“宏任务”机制(如setTimeout或setImmediate)或“微任务”机制(如MutationObserver或process.nextTick)来实现。由于promise实现被视为平台代码,因此它本身可能包含任务调度队列或在其中调用处理程序的“蹦床”。

因此,这实际上是规范要求的。

为了确保明确此要求,我们进行了广泛讨论-请参阅:

  • https://github.com/promises-aplus/promises-spec/pull/70
  • https://github.com/promises-aplus/promises-spec/pull/104
  • https://github.com/promises-aplus/promises-spec/issues/100
  • https://github.com/promises-aplus/promises-spec/issues/139
  • https://github.com/promises-aplus/promises-spec/issues/229


 类似资料:
  • 问题内容: 我想做一些非常简单的事情,但是我一点都不懂… 我希望依次对funcs数组的每个元素进行“处理”,然后输出如下所示: 我无法做到这一点:(应该很简单,我什么都没发现:( 问题答案: 从您的示例来看,我认为您已经看到了Q自述文件中的Sequences部分,但未能理解它。 当每个函数的输出作为输入传递给下一个函数时,原始示例使用“瀑布”模型: 但是您只想按顺序执行我们所有的函数,因此您只需将

  • 问题内容: 问题1:在给定的时间只允许一个API请求,因此,真正的网络请求在尚未完成的情况下排队。应用可以随时调用API级别,并且期望得到回报。当API调用排入队列时,将在将来的某个时刻创建对网络请求的承诺- 返回什么给应用程序?这样可以通过延迟的“代理”承诺来解决: 问题2:对一些API调用进行反跳动,以便随着时间的推移累积要发送的数据,然后在达到超时时分批发送。调用API的应用期望得到回报。

  • 问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困

  • 问题内容: 我无法通过所有论点。我的诺言回调仅收到一个,而不是三个: 知道我在做什么错吗? 问题答案: Q的Promise 只能有一个参数- Promise代表一个单一的值,而不是它们的集合。如果需要多个值,则将它们显式放入数组中。对于多参数回调,您可以使用。

  • 问题内容: 遵循方法有效: 4个问题: 1)如果例如不好,我不想执行其余的功能,那我该如何退出(退出,中断,什么,..)? 2)我如何设置其中一些并行,其中一些串行? 3)如何在它们之间传输数据? 4)如何使以下函数从其先前结果中得到依赖? 问题答案: 您在问如何在promise中 链接 功能。 3)如何在它们之间传输数据? 4)如何使以下功能取决于其先前的结果? 返回 链中 下一个函数的数据(或

  • 问题内容: 编辑 第一个答案是一个很好的答案,但是,正如该问题和另一个关于stackoverflow的问题中多次提到的那样,问题是服务和控制器在数据实际到达之前就运行它们的东西。 (对第一个答案的最后评论:) 是的,问题在于服务运行后API调用完成,并将所有内容返回给控制器,请参阅此处screencast.com/t/uRKMZ1IgGpb7 …这是我的BASE问题,如何在所有部件上等待数据发送到