我不乐观有办法做到这一点,但我想提出这个问题。情况:我正在写一个为新手程序员量身定制的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 });
但那是一个白日梦,不是吗?如果你能想个办法让它成为现实,我很乐意听你这么说。
它为一个简单的脚本增加了很多额外的措辞。我希望这对新程序员来说是不胆小的,所有这些嵌套函数都会开始让人害怕。
嗯,这比用魔法完成的脚本要好得多(当然可能,见下文)。大多数新手将能够弄清楚然后
会做什么,但他们将无法识别魔法-并且当某些东西不起作用时,他们会完全困惑。
顺便说一句,当使用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