【问题标题】:JS promise is getting called without calling itJS promise 被调用而不调用它
【发布时间】:2018-02-22 11:51:14
【问题描述】:

我不知道为什么promise1 一直被调用,即使我从未尝试过解决它。

                    function successCallback() {
                        console.log("doSomething func succeeded with sucess");
                    }
                    
                    function failureCallback() {
                        console.log("doSomething func failed with error");
                    }

                    let promis1 = new Promise((res, rej) => {
                    setTimeout(() => {
                        console.log(`Finally got called`);
                        return res(successCallback());
                    }, 5000);
                    });
    
                    function promise2(value) {
                    return new Promise((res, rej) => {
                        console.log(`This is getting called for some reason ${value}`)
                        return res(failureCallback());
                    });
                    }

                    Promise.resolve("6").then(promise2(6));

这是我得到的输出:

由于某种原因被调用 6

doSomething 函数因错误而失败

终于叫到了

doSomething 函数成功并成功

[Done] 在 5.525 秒内以 code=0 退出

【问题讨论】:

  • 因为promiseseager maybe?
  • let promis1 = new Promise((res, rej) => { ...看到那个功能了吗? (以 (res, rej) => 开头,它作为 Promise 构造函数的一部分被调用
  • 这意味着什么?您正在执行回调而不是将它们用作参数,因此它们将始终执行(failureCallback() vs failureCallback)。 Promise.resolve 在那里做什么。
  • @Jorg 我只是在修补以完全理解承诺。我在学习 Promise 时遇到了困难,所以一点一点地消化它并引入奇怪而复杂的方法是一种帮助我理解 Promise 工作原理的方法
  • 在这种情况下,首先执行rej(failureCallback)res(successCallback)

标签: javascript es6-promise


【解决方案1】:

传递给new Promise 的函数由promise 构造函数立即同步调用(与setTimeout 不同),并且与new Promise 在同一个堆栈上。

如果传递给它的函数抛出,那么它会导致一个被拒绝的承诺:

console.log(1);
const p = new Promise(
  (res,rej)=>{
    console.log(2);
    res();
  }
);
p.then(
  ()=>console.log(7)
);
console.log(3);

console.log(4);
const p2 = new Promise(
  (res,rej)=>{
    console.log(5);
    throw("an error");
  }
);
p2.catch(
  ()=>console.log(8)
);
console.log(6);

【讨论】:

    【解决方案2】:

    也许这会告诉你你的代码流程

    setTimeout(() => console.log(9)); // 9 will log once all the "synchronous" code below is completed
    console.log(1);
    let promis1 = new Promise((res, rej) => {
      console.log(2);
      setTimeout(() => {
        console.log(10);
        return res('resolved 1');
      }, 5000);
    });
    console.log(3);
    function promise2(value) {
      console.log(5);
      return new Promise((res, rej) => {
        console.log(6);
        return res('resolved 2');
      });
    }
    console.log(4);
    promise2().then(() => {
      console.log(8);
    });
    console.log(7);

    注意:一些(大多数?)承诺实现(包括蓝鸟)将输出 1,2,3,4,5,6,7,9,8,10 - 因为.then 回调添加到末尾消息队列 - 而在native 承诺中,.then 回调可能会跳入队列! (或者现在的 javascript 引擎可能比 this simple model

    【讨论】:

    • 谢谢,你能解释一下为什么 promis1 会被调用吗?也许因为我来自 C 并且触发函数的 C 方式只有在 main() 中找到它才会让我误解节点
    • 因为您在 new Promise 的参数中提供的构造函数被同步调用,作为新的 Promise 构造的一部分 - @HMR 的类似答案解释了它 - 我会认为顺序的 console.log 会使程序流程非常明显
    【解决方案3】:

    如果这是更大计划的一部分。将let promis1 = new Promise((res, rej) => {改为promise1 = new Promise((res, rej) => {

    提示:单词“promise”的拼写

    【讨论】:

    • 变量名如何改变新Promise构造函数的动作?提示:它没有。提示 2:可能是此处发布的代码中的错字,而不是实际代码本身(promise1 未定义)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多