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

promise-如何使异步代码在没有async/Await的情况下同步执行?

袁鸿达
2023-03-14
  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))

共有2个答案

呼延俊良
2023-03-14

无法使异步代码同步执行。

即使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"));
田瀚
2023-03-14

您传递给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的其他项构造为同步函数(此方法还将取决于函数本身