Javascript 无法使用promise控制异步任务的顺序

Javascript 无法使用promise控制异步任务的顺序,javascript,promise,settimeout,Javascript,Promise,Settimeout,我在使用promise控制JavaScript中的异步任务时遇到了一个问题。在下面的代码中,我希望在“second”之前输出“first”。我使用了promise then block,但它没有按我所希望的那样工作 我使用setTimeout创建不同的时间延迟,以便无论发生什么情况,都可以控制异步任务的顺序。有人能帮我理解为什么代码没有给出我想要的输出吗 代码如下: let first=新承诺((解决、拒绝)=>{ 设置超时(()=>{ 解析(console.log('first'); },

我在使用promise控制JavaScript中的异步任务时遇到了一个问题。在下面的代码中,我希望在“second”之前输出“first”。我使用了promise then block,但它没有按我所希望的那样工作

我使用
setTimeout
创建不同的时间延迟,以便无论发生什么情况,都可以控制异步任务的顺序。有人能帮我理解为什么代码没有给出我想要的输出吗

代码如下:

let first=新承诺((解决、拒绝)=>{
设置超时(()=>{
解析(console.log('first');
}, 30);
});
让第二个=新承诺((解决,拒绝)=>{
设置超时(()=>{
解析(console.log('second');
}, 3);
});

首先,然后(第二)如果您并行启动两个承诺,并由
setTimeout
解决,则无法控制日志顺序

您需要在两者之间建立某种顺序依赖关系,以便按顺序解决它们

一种方法可以是:-

let first = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(console.log('first'));
    }, 30);
});

first.then(() => {
    let second = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(console.log('second'));
        }, 3);
    });
    return second;
})

如果您并行启动两个承诺,并由
setTimeout
解决,则无法控制日志顺序

您需要在两者之间建立某种顺序依赖关系,以便按顺序解决它们

一种方法可以是:-

let first = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(console.log('first'));
    }, 30);
});

first.then(() => {
    let second = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(console.log('second'));
        }, 3);
    });
    return second;
})

将它包装到一个函数并创建一个闭包,当您正确调用它时,它将被调用

let first=()=>新承诺((解决、拒绝)=>{
设置超时(()=>{
解析(console.log('first');
}, 30);
});
让第二个=()=>新承诺((解决,拒绝)=>{
设置超时(()=>{
解析(console.log('second');
}, 3);
});

首先(),然后(第二)将它包装到一个函数中并创建一个闭包,当您正确调用它时,它将被调用

let first=()=>新承诺((解决、拒绝)=>{
设置超时(()=>{
解析(console.log('first');
}, 30);
});
让第二个=()=>新承诺((解决,拒绝)=>{
设置超时(()=>{
解析(console.log('second');
}, 3);
});

首先(),然后(第二)第一个问题是,承诺构造函数执行器函数在承诺兑现之前调用了
console.log()
。相反,您应该等待
console.log()
承诺实现的值:

let first=新承诺((解决、拒绝)=>{
设置超时(()=>{
决议(“第一”);
}, 30);
});
让第二个=新承诺((解决,拒绝)=>{
设置超时(()=>{
决议(‘第二’);
}, 3);
});
首先。然后((值1)=>{
console.log(value1);
});
第二个。然后((值2)=>{
console.log(value2);

});第一个问题是,承诺构造函数执行器函数在承诺兑现之前调用了
console.log()
。相反,您应该等待
console.log()
承诺实现的值:

let first=新承诺((解决、拒绝)=>{
设置超时(()=>{
决议(“第一”);
}, 30);
});
让第二个=新承诺((解决,拒绝)=>{
设置超时(()=>{
决议(‘第二’);
}, 3);
});
首先。然后((值1)=>{
console.log(value1);
});
第二个。然后((值2)=>{
console.log(value2);

});我不认为您的代码示例反映了您的真实情况,因此我认为在代码示例中解决这个问题是没有用的

以下是我认为您拥有的:

//返回承诺并花费一定时间的任务
const task=(name)=>newpromise(resolve=>setTimeout(()=>resolve(name),Math.random()*1000));
//使用任务结果的函数
const taskDone=(name)=>console.log(name+'done');
//该任务的两个实例,以不可预测的顺序完成
var action1=任务(“任务1”)。然后(任务完成);

var action2=任务(“任务2”)。然后(任务完成)我不认为您的代码示例反映了您的真实情况,因此我认为在代码示例中解决这个问题是没有用的

以下是我认为您拥有的:

//返回承诺并花费一定时间的任务
const task=(name)=>newpromise(resolve=>setTimeout(()=>resolve(name),Math.random()*1000));
//使用任务结果的函数
const taskDone=(name)=>console.log(name+'done');
//该任务的两个实例,以不可预测的顺序完成
var action1=任务(“任务1”)。然后(任务完成);

var action2=任务(“任务2”)。然后(任务完成)首先。然后(…)
在第一次执行
时调用回调函数。传递一个承诺对象是没有意义的。首先尝试
,然后(()=>第二次)
你真正的代码实际上并没有使用
setTimeout()
来处理任何事情-你所拥有的只是两个异步请求,你想在
第二个之前打印
第一个
,对吗?一旦承诺完成,可以说火车已经离开车站了<代码>首先。然后(…)
在第一次执行
时调用回调函数。传递一个承诺对象是没有意义的。首先尝试
,然后(()=>第二次)
您真正的代码实际上并没有对任何东西使用
setTimeout()
,您所拥有的只是两个异步请求,并且您希望在
第二个
之前打印
第一个
,对吗?这是一个重要的观点:“…承诺构造函数执行器函数在承诺兑现之前调用console.log()这是一个重要的观点:“…承诺构造函数执行器函数在承诺兑现之前调用console.log()”。我确实认为这个答案包含有用的信息,但你必须承认它读起来像是一个政客的回答:“这是你应该问的问题的答案……”Patrick我不相信“按要求回答问题”是这个网站运作的唯一规则。