当前位置: 首页 > 知识库问答 >
问题:

等到所有的promise都在JavaScript中解决

孙思源
2023-03-14

我不乐观有办法做到这一点,但我想提出这个问题。情况:我正在写一个为新手程序员量身定制的JavaScript游戏引擎。我希望主脚本界面尽可能简单和可访问。理想情况下,脚本最终会看起来像这样:

this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000, sync: true });
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });

在这个场景中,第一个背景会在一秒钟内完全淡入,然后第二个背景会同步淡入。问题出在哪里?JavaScript将在第一个命令完成之前尝试执行第二个命令。

现在,正确的处理方法是使用promise。类似的东西:

this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000 }).then(() => {
  this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });
});

这完全是一种选择。(事实上,这可能是我不得不接受的。)但我不想走这条路有两个原因。首先,它在一个简单的脚本中添加了很多额外的措辞。我希望这对新程序员来说是不胆小的,所有这些嵌套函数都会开始让人害怕。其次,promise不能很好地处理控制流。即使像if-then这样简单的语句也会变得粗糙。

我真正想要的是这样做的方法:

this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000, sync: true });
waitUntilAllPromisesAreResolved();
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });

但那是一个白日梦,不是吗?如果你能想个办法让它成为现实,我很乐意听你这么说。

共有1个答案

卫招
2023-03-14

它为一个简单的脚本增加了很多额外的措辞。我希望这对新程序员来说是不胆小的,所有这些嵌套函数都会开始让人害怕。

嗯,这比用魔法完成的脚本要好得多(当然可能,见下文)。大多数新手将能够弄清楚然后会做什么,但他们将无法识别魔法-并且当某些东西不起作用时,他们会完全困惑。

顺便说一句,当使用promise而不是回调时,你几乎不应该嵌套函数,因为promise形成了一个扁平的链。

其次,promise不能很好地处理控制流。即使像if-then这样简单的语句也会变得粗糙。

他们比大多数其他选择做得更好。请参阅这个简单的if语句示例。

我真正想要的是这样做的方法:

this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000, sync: true });
waitUntilAllPromisesAreResolved();
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });

但那是一个白日梦,不是吗?

不一定——有发电机,最终会有异步/等待。允许您在异步函数中使用同步(普通)控制流语句:

(async function() {
    await this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000});
    await this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });
    console.log("both done");
}()); // returns a promise

不过,您必须使用ES6/ES7 transpiler进行这些操作。

然而,即使是一个简单的

this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000, sync: true });
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });

在第一个效果之后的第二个效果在今天是非常可能的!您只需要在this上放置一个动画的内部队列,背景方法将添加到该队列中,而不是立即执行。jQuery确实使用了这种方法,并且非常流行!

 类似资料:
  • 我在一个数组上循环,并对一个api进行异步调用,返回的数据需要我与一个不同的数组合并,合并时面临的问题是,一些promise尚未解决,因此合并后产生的数组丢失数据.任何想法如何去做这件事。(我对Angular是新的)。数组循环通过至少有200个元素(我不知道数组的大小提前)我从每个元素获得id,我调用这个服务: 提前谢谢。

  • 假设我有2个或更多异步调用: 在脚本的后面,我想确保在使用变量之前设置了它们。 此示例代码遵循angularjs中的Firebase示例。 有什么想法吗?

  • 所以我有一个情况,我有多个未知长度的promise链。我希望在处理完所有链后运行一些操作。这可能吗?这里有一个例子: 在本例中,我为promise一、promise二和promise三设置了一个,这些promise将在某个随机时间得到解决。然后,我在第一和第三段的末尾加上promise。我希望在解析所有链后解析。以下是我运行此代码时的输出: 有没有办法等待锁链解决?

  • 我正在做一个forEach循环,它对Cloudinary进行API调用,我正在用响应数据构建一个数组。 一旦收集到数据,我需要将其发送到其他API。 在发送数据之前,我如何等待promise得到解决并收集数据? 这是我的代码:

  • 假设我有一组正在发出网络请求的,其中一个将失败: 假设我想等到所有这些都完成了,不管有没有一个失败了。可能有一个网络错误的资源,我可以生存没有,但如果我可以获得,我想要在我继续。我想优雅地处理网络故障。 由于没有为此留出任何空间,那么在不使用promissions库的情况下,处理此问题的推荐模式是什么?

  • 如果我有这个功能 然后投入140000000,那么这将需要一秒钟来完成。如果我需要返回的值来继续一个函数的其余部分,我想我需要等待响应,这样我就可以使用响应了 但事实上,我认为它与其说是一个值,我需要传递到下一个函数中,让它工作,所以它基本上没有等待响应,因为它基本上发送一个函数作为参数,如 所以,也许我在这里花了很多时间,但基本上,我如何实现同步编程,什么不适合速度,什么是正确使用异步和prom