带有 setTimeout 的 Promise 链

问题描述 投票:0回答:2

我是 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

	
javascript promise settimeout
2个回答
1
投票
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);

如您所见,没有唯一的解决方案。


0
投票
doSomething

。第一个计时器开始倒计时。


然后你

立即

创建另一个承诺并将其分配给doSomethingElse。第二个计时器开始倒计时。


在第一个承诺解决之后
创建第二个承诺。

© www.soinside.com 2019 - 2024. All rights reserved.