我是 javascript 的新手,现在正在学习 Promise 部分。
下面我一直在尝试用 setTimeout 编写一个承诺链,并期望它在 2 秒后打印“第一个结果”,并在另外 2 秒后打印“第二个结果”。但是,它同时打印“第一个结果”和“第二个结果”。
谁能告诉我我哪里做错了?
var doSomething = new Promise(function(resolve,reject){
setTimeout(function(){
resolve('first result');
},2000);
});
var doSomethingElse = new Promise(function(resolve,reject){
setTimeout(function(){
resolve('second result');
},2000);
});
doSomething
.then(function(result){
console.log("This is the "+result);
return doSomethingElse;
})
.then(function(result){
console.log("This is the "+result);
});
==============================
编辑: 因此,当我如下编写 Promise 时,执行器函数(setTimeout)立即开始计数,并在 2 秒后解决。
var doSomething = new Promise(function(resolve,reject){ // starts counting here
setTimeout(function(){
resolve('first result');
},2000);
});
但是,如果我将 Promise 包装在函数内,如下所示,则执行器函数 (setTimeout) 仅在我调用该函数之后才开始计数。这是正确的吗?
function doSomething(){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve('first result');
},2000);
})
}
doSomething(); // starts counting here
doSomething
承诺和
doSomethingElse
承诺是快速连续创建的,并将在大约2秒后快速连续解决。代码中没有任何内容可以使两个进程按顺序进行。为此,您需要确保 doSomethingElse
在
doSomething
完成后 2 秒开始。您可以通过多种方式组织代码来实现这一点。
例如,您可以将
new Promise(...)
表达式直接写入 Promise 链中,而不进行任何赋值:
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
})
.then(function(result) {
console.log("This is the " + result);
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
})
.then(function(result) {
console.log("This is the " + result);
});
或者,您可以将
doSomething
和
doSomethingElse
写为函数:
function doSomething() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
});
}
function doSomethingElse() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
}
doSomething()
.then(function(result) {
console.log("This is the " + result);
return doSomethingElse();
})
.then(function(result) {
console.log("This is the " + result);
});
或者,您可以编写一个
doSomething()
函数并调用它两次:
function doSomething(value) {
return new Promise(function(resolve,reject) {
setTimeout(function() {
resolve(value);
},2000);
});
}
doSomething('first result')
.then(function(result) {
console.log("This is the " + result);
return doSomething('second result');
})
.then(function(result) {
console.log("This is the " + result);
});
或者,回到
doSomething()
和
doSomethingElse()
作为单独的函数,您可以添加第三个 logResult()
函数来执行日志记录:
function doSomething() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
});
}
function doSomethingElse() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
}
function logResult(result) {
console.log("This is the " + result);
}
doSomething()
.then(function(result) {
logResult(result);
return doSomethingElse();
})
.then(function(result) {
logResult(result);
});
上一个示例的一个很好的功能是 Promise 链将简化如下:
function doSomething() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('first result');
}, 2000);
});
}
function doSomethingElse() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('second result');
}, 2000);
});
}
function logResult(result) {
console.log("This is the " + result);
}
doSomething()
.then(logResult)
.then(doSomethingElse)
.then(logResult);
如您所见,没有唯一的解决方案。
doSomething
。第一个计时器开始倒计时。
然后你立即
创建另一个承诺并将其分配给doSomethingElse
。第二个计时器开始倒计时。
在第一个承诺解决之后