首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动作英雄动作立即返回

动作英雄动作立即返回
EN

Stack Overflow用户
提问于 2018-04-27 20:29:51
回答 1查看 73关注 0票数 0

我正在尝试理解ActionHero异步/等待的核心概念,并触及许多墙。从本质上说,在一个动作中,为什么这个值会立即返回,而不是在500 an之后?

代码语言:javascript
复制
async run (data) {
  setTimeout(() => data.response.outcome = 'success',500)
}

澄清编辑:这个问题更多的是关于异步执行流程和承诺实现,而不是关于setTimeout()的字面用法。它并不是专门针对ActionHero的,但这是AH使用的模式,也是我第一次接触这些概念。提供的答案澄清了某些功能必须包装在一个承诺中,这样它们就可以等待编辑,并且有多种方法可以实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-27 20:37:37

因为你没等它完成。

基本上,您需要等待setTimeout。

代码语言:javascript
复制
async run (data) {
  await setTimeout(() => data.response.outcome = 'success',500)
}

但这行不通,因为setTimeout不是一个承诺

您可以使用经过一段时间后解析的简单睡眠函数。

代码语言:javascript
复制
async function sleep (time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

async function run (data) {
  await sleep(500);
  data.response.outcome = 'success';
}

就像setTimeout,它是一个回调api可以成为一个承诺,流可以变成承诺。注意,在睡眠和readFile示例中,我只使用异步关键字来澄清问题

代码语言:javascript
复制
  async readFile (file) {
    return new Promise((resolve, reject) => {
      let data = '';
      fs.createReadStream(file)
        .on('data', d => data += d.toString())
        .on('error', reject)
        .on('end', () => resolve(data));
    });
  }

对于大多数函数,您可以跳过手工编程并使用util.promisify。

代码语言:javascript
复制
   const { readFile } = require('fs');
   const { promisify } = require('util');

   const readFileAsync = promisify(readFile);

关键是在工作完成后,承诺应该解决,并且您应该使用await.then来等待它。

例如,为了使事情更清楚,第一个例子

代码语言:javascript
复制
async function run (data) {
  return sleep(500).then(() => data.response.outcome = 'success';);
}

甚至

代码语言:javascript
复制
function run (data) {
  return sleep(500).then(() => data.response.outcome = 'success';);
}

在运行时都是一样的

所以要完成

代码语言:javascript
复制
async function transform (inputFile, targetWidth, targetHeight) {
  return new Promise((resolve, reject) => {
    let transformer = sharp()
      .resize(targetWidth, targetHeight)
      .crop(sharp.strategy.entropy)
      .on('info', { width, height } => console.log(`Image created with dimensions ${height}x${width}`)
      .on('error', reject)
      .on('end', resolve);
    inputFile.pipe(transformer);
  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50069861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档