RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 635525
Accepted
VostokSisters
VostokSisters
Asked:2020-03-05 05:03:53 +0000 UTC2020-03-05 05:03:53 +0000 UTC 2020-03-05 05:03:53 +0000 UTC

承诺的工作决心

  • 772

有这段代码,我不清楚其中的一个方面:

    'use strict';
    
    let promise = new Promise((resolve, reject) => {
      resolve("Промис завершился");
      console.log("Промис ждет, пока я появлюсь");
    });
    
    promise
      .then(
        result => console.log("Fulfilled: " + result), 
        error => console.log("Rejected: " + error) 
      );

其实不清楚构造函数中的alert一般是自己算出来出现的。紧随其后(一点也不清楚——为什么在它后面?)“承诺已经结束”出现了。
目前尚不清楚它的工作原理是什么resolve(),即控制权转移到处理程序.then。
我已经多次看到它们resolve()专门放在处理程序 onload中(例如,对于 ajax 请求),这本身就表明问题已完成。但事实证明,resolve()您至少可以从一开始就推动,下面的代码仍然有效。
是的,当然,在ajax的情况下,你可以预料到请求会被服务器拒绝,所以你需要resolve()在成功的情况下使用它,并reject()在错误的情况下使用它。
帮助我理解。

javascript
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. vp_arth
    2020-03-05T16:24:20Z2020-03-05T16:24:20Z

    Promise(承诺)本身不等待任何人。
    您只需具备处理同步和异步代码的能力。
    创建的 Promise立即同步执行(实际上它取决于实现),并在事件循环的下一个周期通知其订阅者(然后)。

    让我们通过一个例子来看看它的行为:

    'use strict';
        
        let promise = new Promise((resolve, reject) => {
          resolve("Промис завершился");
          console.log("1. Promise created");
        });
        console.log('2. After creation');
        promise
          .then(
            result => console.log("3. Resolved: " + result),
            error => console.log("Rejected: " + error) 
          );
        console.log('2.5 функция в .then тем не менее будет вызвана позже');

    如您所见,在创建后,Promise 立即(同步)启动了它的执行器,但是 then 中的处理程序将在 eventLoop 的下一次迭代中被调用。


    一个内部实现的例子(非常精简):

    function Thennable(executor) {
      let thenList = [];
      let state = 0; // 1 - resolved, 2 - rejected
      let value = null;
      // executor вызывается сразу же, синхронно
      executor(
        res => { 
          thenList.forEach(then => 
            // обработчики вызываются асинхронно.
            setTimeout(() => then[0](res)));
          state = 1;
          value = res;
        },
        error => { 
          thenList.forEach(then => 
            setTimeout(() => then[1](error))
          );
          state = 2;
          value = error;
        }
      );
      this.then = (onResolve, onReject) => {
        if (state == 0) {// ещё не обработано, добавим в очередь ожидающих
          thenList.push([onResolve, onReject]);
        } else if (state == 1) { // resolved
          onResolve(value);
        } else if (state == 2) { // rejected
          onReject(value);
        }
        // return new Thennable(...)
      };  
    }
    
    let p = new Thennable((ok, fail) => {
      ok('resolved');
      console.log('1 created');
    });
    console.log('2 after create');
    p.then(res => console.log(3, res))

    • 3
  2. Best Answer
    user207618
    2020-03-05T15:30:38Z2020-03-05T15:30:38Z

    在 JS 中,只有 or return,一个错误,或者它的结束可以停止一个函数。
    阅读。

    在等待时,使用了某种异步方法(否则它无法捕获异步操作,你的 KO):当承诺被解决时,回调排队直到函数中等待代码的末尾,然后才被调用。

    如果不需要,请使用return: return resolve();。

    • 2
  3. DarkSir
    2020-03-05T15:00:09Z2020-03-05T15:00:09Z

    resolve()一个普通的回调函数,一个告诉 promise 进入 fulfilled 状态的调用。resolve()不会停止 promise 中函数的执行。

    • 1
  4. ThisMan
    2020-03-05T15:30:52Z2020-03-05T15:30:52Z

    我会引用这篇文章,以免误会:

    按照标准,new Promise(executor)对象在创建时有四个内部属性:

    PromiseState - 状态,第一个“待定”。

    PromiseResult - 结果,创建时没有值。

    PromiseFulfillReactions 是成功处理程序函数的列表。

    PromiseRejectReactions 是错误处理程序函数的列表。

    当执行器函数调用 reject 或 resolve 时,PromiseState 变为“resolved”或“rejected”,并且相应列表中的所有处理函数都被移至特殊的“PromiseJobs”系统队列。

    这个队列在解释器“无事可做”时自动执行。

    也就是说,resolve它不会立即调用该函数,而是等待 end функции-executor,这是在创建时传递的promise-a

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5