我的 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();
我正在尝试理解 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();