我的 ECMA 6 Promise 没有以同步方式解析

my ECMA 6 Promises do not resolve in sync way

我正在尝试理解 ES6 Promises(以及一般的 promises),但我并不清楚。我试图获取此代码 运行 :

var function1 = function() {
    console.log("function 1 has started")
}

var function2 = new Promise((resolve, reject) => {
    console.log("function2 has started");
    setTimeout(function() {
        console.log("function2 has ended")
        resolve();
    }, 3000) 
})

var function3 = new Promise((resolve, reject) => {
    console.log("function3 has started");
    setTimeout(function() {
        console.log("function 3 has ended")
        resolve()
    },2000)
})

var myFunc = function () { 
    function3.then(function2).then(function1())
}

myFunc();

我期望的输出:

function3 has started
//after 2 seconds
function3 has ended
function2 has started
//after 3 seconds
function2 has ended
function1 has started

我得到的输出:

function2 has started
function3 has started
function1 has started
//after 2 seconds
function3 has ended
//1 second more
function2 has ended

你能解释一下我的代码哪里做错了吗?

请记住两点:

  • 调用 Promise 构造函数时,传递的回调函数总是从构造函数内部立即被调用。
  • 您传递给 then() 或 catch() 的回调永远不会被立即调用。

因此,在您的场景中,字符串 "function2 has started" 和 "function3 has started" 被打印 当两个 Promise 被构造时

"function 1 has started" 之后立即打印,因为您直接从 myFunc() 中调用它。您可能打算像这样传递 function1 而不带括号

function3.then(function2).then(function1)

在那种情况下,function1 只会在最后(如您预期的那样)在两个承诺都实现后被调用。

我认为其余两个输出的顺序很清楚,"ended" 消息在调用 setTimeout 回调时打印出来。

以下生成您期望的输出。

var function1 = function() {
    console.log("function 1 has started")
}

var function2 = function () {
    return new Promise((resolve, reject) => {
        console.log("function2 has started");
        setTimeout(function() {
            console.log("function2 has ended")
            resolve();
        }, 3000);
    });
};

var function3 = function () {
    return new Promise((resolve, reject) => {
        console.log("function3 has started");
        setTimeout(function() {
            console.log("function 3 has ended")
            resolve()
        }, 2000);
    });
};

var myFunc = function () { 
    function3().then(function2).then(function1);
}

myFunc();