【问题标题】:How does JS Promises work internally?JS Promises 在内部是如何工作的?
【发布时间】:2016-07-21 03:50:54
【问题描述】:

我想知道 js promises 在内部是如何工作的。

我用谷歌搜索过,但找不到答案(或者我不知道如何用谷歌搜索)。

我不知道它是如何回复你的。

假设我有这个客户端代码:

function whatever() {
    doSomethingLocally;

    callPromiseThatGoesAllOverTheWorldAndThenGetsBackToYou()
        .then(
            doSomethingLocallyAgain
        );

     doSomeOtherThingLocally;
}

我想知道,当承诺实现时,它如何回到代码中的正确点(即“doSomethingLocallyAgain”)。

【问题讨论】:

  • 虽然规范describes how they behave,但它们实际上如何在内部工作 取决于规范实施者(即JavaScript 引擎)的职权范围。您问这个问题是否有根本原因,因为这可能是一个更好的问题?
  • 我问这个是因为我不知道流程是如何回到那个确切点的。我不知道是否有一个套接字一直在用指针监听某些东西,所以当它收到响应时,它会将流更改到那个点。
  • doSomethingLocallyAgain 必须是一个函数。您正在将该函数传递给 Promise,一旦完成,它就会简单地调用该函数。它没有什么神奇之处。这是回调如何工作的简化示例:function do(f) { setTimeout(() => { /* do some internal stuff */ f(); }, 3000); }; do(() => console.log('call me maybe'));。在这个例子中,do 接受一个函数并在它准备好时调用它。
  • 如果你对引擎内部(原生 ES6 实现)不是很感兴趣,你可能会对 Concept - Distilling how a promise works?How is a promise/defer library implemented? 感兴趣
  • 是的,这很有帮助,@Bergi。我还要补充一点:promisejs.org/implementing 我在想像你调用一个承诺,它会去一个 api 来获得你想要的结果,然后返回给你,我怎样才能让它与我的代码同步。

标签: javascript asynchronous es6-promise


【解决方案1】:

promise 只是一个花哨的返回值,您可以将回调附加到,而不是将它们传递给函数。添加一个很好的不变量,即永远不会立即调用回调,而是始终将其放在微任务队列中,仅此而已。

【讨论】:

    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多