JS承诺在不调用它的情况下被调用

时间:2018-02-22 03:08:50

标签: javascript es6-promise

我不知道为什么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 func失败,错误

     

终于被召唤了

     

doSomething func成功完成了

     

[完成]退出,代码= 0,在5.525秒

3 个答案:

答案 0 :(得分:2)

传递给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);

答案 1 :(得分: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);

注意:一些(大多数?)承诺实现(包括bluebird)将输出1,2,3,4,5,6,7,9,8,10 - 因为.then回调被添加到最后消息队列的情况 - 然而,在native承诺中,.then回调可能会跳过队列! (或者这些天可能还有更多的javascript引擎,而不是this simple model

答案 2 :(得分:-2)

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

提示:拼写“承诺”一词