承诺链执行流程
const timeoutPromise = (interval, intervalName) => {
return new Promise((resolve, reject) => {
setTimeout(function(){
console.log(`Executed ${intervalName} at: ${new Date().toString()} with interval of ${interval}`);
resolve();
}, interval);
});
};
let main = () => {
console.log('Starting at:', new Date().toString());
console.log('Completed at:', new Date().toString());
};
从上面给出的图像中,创建一个以2个字段为参数的函数:- 一个字母(在我们的情况下,A、B、C、D)- 以毫秒为单位的时间将是您提供的任何不同值
在函数内部,必须有一个setTimeout,其值为上述时间
主函数将开始执行,使得上述创建的函数将按照上述指定的时间顺序执行,即:- A & D会一起开始- C只有在A & D完成后才开始- B将在A完成后立即开始
执行方式必须:- 程序执行开始时,应在控制台中记录时间和消息- 当程序执行结束时,应在控制台中记录时间和消息- 每次调用该函数时都应记录时间和字母
我尝试了所有可能的方法,但要么函数A运行了两次,要么B在程序执行结束后被记录...
4条答案
按热度按时间vaj7vani1#
要按特定顺序解决承诺,您需要相应地链接它们。以下是其中一种方法的细分:
1.由于
A
和D
可以立即启动,我们调用timeoutPromise
函数并将返回的promise保存在变量中,以便稍后引用它们。1.由于我们需要在
A
解析后立即启动B
,因此可以在变量中保存对A
承诺的引用,以便在A
完成时启动B
。1.我们可以使用
Promise.all
来等待A
和D
都解析好,然后再启动C
。Promise.all
用于等待B
和C
承诺稳定,以确保在我们结束执行之前两个承诺都已稳定。运行示例:
5lhxktic2#
使用
setTimeout
很可能不是安排一系列承诺的最佳方法,下面是一个不同的方法,它使用async
函数来帮助澄清执行顺序:一开始,承诺D和A是并行等待的。一旦它们实现了,承诺C和B也是并行等待的。诚然,承诺B可以开始得稍微早一点,因为它不依赖于D的实现,但这最终不会真正产生显著的差异。而且,为了代码易于阅读和理解,我认为这种解决方案是足够的。
好的,这里是另一个版本--稍微有点难读--它允许D和B部分并行运行(B可以在A解决后启动):
x一个一个一个一个x一个一个二个x
不要被脚本末尾的
await A
和await D
所迷惑:由于这两个承诺都已经解决,这里不再需要额外的"等待"时间,需要await
来访问承诺a
和d
返回的数据。5t7ly7z53#
一些可怕的职位在这里🙃
work
下面是一个生成承诺值的通用函数。请将work
替换为任何生成承诺的函数。run
编码依赖关系图-nbysray54#
除了优萨夫的回答,这里还有一个概括性的尝试,让术语“任务”表示一个返回承诺的函数。
可以将单个任务
add
艾德到Tasks
示例中,并为它们所依赖的每个其他任务调用它们的after
方法。然后,Tasks
示例的execute
方法按必要的顺序执行所有任务(如果它能找到一个,即除非存在循环依赖关系)。