var p1 = new Promise(function(resolve, reject) {
setTimeout(() => resolve("first"), 5000);
});
var p2 = new Promise(function(resolve, reject) {
setTimeout(() => resolve("second"), 2000);
});
var p3 = new Promise(function(resolve, reject) {
setTimeout(() => resolve("third"), 1000);
});
console.log("last to print");
p1.then(()=>p2).then(()=>p3).then(()=> console.log("last to be printed"))
当我在阅读有关承诺的文章时,我知道当我使用async/Await时,我可以同步打印承诺(在本例中为print:first,second,third,last to print)。现在我也读到了使用链接和异步/等待也可以达到同样的目的。然而,当我试图将我的承诺链接起来时,除了“最后一次打印”的console.log之外,什么也没有发生。任何洞察力都会很棒!谢谢!!
编辑到问题:
var p1 = new Promise(function (resolve, reject) {
setTimeout(() => console.log("first"), 5000);
resolve("first resolved")
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(() => console.log("second"), 2000);
resolve("second resolved")
});
var p3 = new Promise(function (resolve, reject) {
setTimeout(() => console.log("third"), 0);
resolve("third resolved")
});
console.log("starting");
p1.then((val) => {
console.log("(1)", val)
return p2
}).then((val) => {
console.log("(2)", val)
return p3
}).then((val) => {
console.log("(3)", val)
})
日志:
starting
(1) first resolved
(2) second resolved
(3) third resolved
third
second
first
1:如果传递给new Promise的executor函数在返回new Promise之前被立即执行,那么为什么在setTimeouts(异步)被执行之后,这里的Promissions resolved()synchronouts()?
返回值与解析承诺:
var sync=function(){return new Promise(function(resolve,reject){setTimeout(()=>{console.log(“start”)resolve(“hello”)//---工作//return“hello”//-->不做任何事情},3000);})}sync().then((val)=>console.log(“val”,val))
无法使异步代码同步执行。
即使async
/await
也只是一种语法,它在Promise中为您提供了一个同步样式的控制流。
然而,当我试图将我的承诺链接起来时,除了“最后一次打印”的console.log之外,什么也没有发生。任何洞察力都会很棒!
其他函数不生成任何输出。这与他们的承诺无关。
你开始三个计时器(所有的时间),然后记录“最后打印”,然后链接一些承诺,使“最后打印”将打印时,所有三个承诺解决(5秒后,你开始他们所有)。
如果您希望计时器按顺序运行,那么您必须在前一个计时器完成时才启动它们,如果您想查看它们的解析结果,那么您必须编写实际查看该结果的代码。
null
function p1() {
return new Promise(function(resolve, reject) {
setTimeout(() => resolve("first"), 5000);
});
}
function p2() {
return new Promise(function(resolve, reject) {
setTimeout(() => resolve("second"), 2000);
});
}
function p3() {
return new Promise(function(resolve, reject) {
setTimeout(() => resolve("third"), 1000);
});
}
function log(value) {
console.log("Previous promise resolved with " + value);
}
p1()
.then(log)
.then(p2)
.then(log)
.then(p3)
.then(log)
.then(() => console.log("last to be printed"));
您传递给new promise
的executor函数将在返回新promise之前立即执行。因此,当您这样做时:
var p1 = new Promise(function(resolve, reject) {
setTimeout(() => resolve("first"), 5000);
});
...在将承诺分配给P1
时,SetTimeout
已被调用,并在五秒后安排回调。无论您是否监听promise的解决方案,都会发生回调,无论您是通过await
关键字还是通过then
方法监听解决方案,都会发生回调。
因此,您的代码立即启动三个settimeouts
,然后开始等待第一个承诺的解决方案,然后只等待第二个承诺的解决方案(它已经解决了,所以这几乎是立即的),然后等待第三个承诺的解决方案(同样)。
若要使您的代码仅在前一个超时完成时依次执行那些settimeout
调用,则必须在前一个承诺解决之前(使用较短的超时以避免大量等待)不创建新承诺:
null
console.log("starting");
new Promise(function(resolve, reject) {
setTimeout(() => resolve("first"), 1000);
})
.then(result => {
console.log("(1) got " + result);
return new Promise(function(resolve, reject) {
setTimeout(() => resolve("second"), 500);
});
})
.then(result => {
console.log("(2) got " + result);
return new Promise(function(resolve, reject) {
setTimeout(() => resolve("third"), 100);
});
})
.then(result => {
console.log("(3) got " + result);
console.log("last to print");
});
本文向大家介绍async/await让异步操作同步执行的方法详解,包括了async/await让异步操作同步执行的方法详解的使用技巧和注意事项,需要的朋友参考一下 一.前言 我们经常会遇到这样的麻烦事,多个函数按顺序执行,返回结果却不是我们预期的顺序,原因一般是由于异步操作引起的,所以呢,我们需要一种解决方案来处理这种问题,从而使得异步操作按照同步的方式来执行,这样我们就可以控制异步操作输出结果的
假设我有以下内容: 然后我这样称呼它: 我省略了并且没有将声明为这一事实是否使它实际上是异步的? 我希望发生的情况是循环会立即完成,因为即使花费了很长时间,也不会被等待,并且会立即返回。 我认为这会导致文件内容在这样调用时被覆盖的问题,但这使我认为代码是以某种方式自动转换为同步代码的(尽管似乎不可能知道何时完成)。 那么,简单地说,从非异步方法调用函数是否会自动使代码同步执行,以及省略和(如在函数
这就是它看起来的样子。 它工作得很好,等待数据加载,然后开始操作。但这是相当多的代码,有没有更好的方法来做它?
本文向大家介绍vue如何使用async、await实现同步请求,包括了vue如何使用async、await实现同步请求的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了vue如何使用async、await实现同步请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以下是vue method的demo: 其中方法需要用async修饰, 然
我们有一个应用程序,将部署在具有不同IP的服务器上。JNLP是在构建时生成的。因此,我们定义了没有代码库的JNLP: 然而,当第二次启动这个应用程序时(从第一次启动时创建的桌面图标),代码库被设置为本地文件系统,这是绝对无用的。我希望Java Webstart在第一次启动应用程序时使用实际的源地址设置代码库。这似乎不是真的。 我如何准备一个通用的JNLP,它可以在不同的服务器上使用而无需修改?
问题内容: 我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。 并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。 使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身