javascript - Promise 链拆分以执行多个异步任务

标签 javascript node.js asynchronous es6-promise

我有一个 promise 链,我想在其末尾执行并行的多个 waterfall 操作。

fetchFiles(conf.src, conf.dest)
            .then(function(result) {
                return filterFiles(result, conf);
            })                                             // Here
            .catch(function(error) {
                console.log("Fail: " + error);
            });

此处位置我有一个文件数组。我想foreach结果>打开文件>转换>保存文件

对操作不感兴趣,只是如何将操作连接在一起

我正在尝试在 ES6 中执行此操作

最佳答案

我认为以下内容就是您要寻找的内容。为了方便起见,我仅将 Bluebird 用于 .delay 方法,以模拟需要不同时间长度的不同任务。其余的应该在 ES2015 promise 上运行。您应该能够复制粘贴整个内容,npm install bluebird,然后运行代码。您将看到所有不同的任务都是并行运行的,并且异步且无序地完成。当然,对于每个文件,任务打开转换保存按顺序发生。 (我希望没有人反对我最近对分号的厌恶)

'use strict'

var Promise = require('bluebird') // not needed for the actual solution

let inputFiles=[1,2,3,4,5,6,7,8,9,10,11,12]

Promise.resolve(inputFiles)  // this is your array of inputfiles
 .then(  files => {
    return files.map( file => {   // map each file to a promise sequence
      return openFile(file)
              .then(transformFile)
              .then(saveFile)
              .then(allDone)
    })
  })
 .catch( error => {
   console.error("Fail: " + error);
 })

// need to generate a promise for the opened file
function openFile(file) {
 return Promise.delay( file + '_opened',  Math.floor( Math.random() * 1000));
}

// these tasks don't need to return a promise, I'm just using
// Promise.delay as a convenience to simulate asynchrony
function transformFile(file) {
 console.log(`File ${file} opened ... Transforming`)
 return Promise.delay( file + '_transformed',  Math.floor( Math.random() * 1000));
}

function saveFile(file) {
 console.log(`File ${file} transformed ... Saving`)
 return Promise.delay( file + '_saved', Math.floor( Math.random() * 1000));
}

function allDone(file) {
 console.log(`File ${file} completed ... `)
}

上面将生成如下输出:

File 6_opened opened ... Transforming
File 4_opened opened ... Transforming
File 7_opened opened ... Transforming
File 11_opened opened ... Transforming
File 7_opened_transformed transformed ... Saving
File 6_opened_transformed transformed ... Saving
File 3_opened opened ... Transforming
File 2_opened opened ... Transforming
File 11_opened_transformed transformed ... Saving
File 10_opened opened ... Transforming
File 4_opened_transformed transformed ... Saving
File 8_opened opened ... Transforming
File 12_opened opened ... Transforming
File 10_opened_transformed transformed ... Saving
File 5_opened opened ... Transforming
File 1_opened opened ... Transforming
File 3_opened_transformed transformed ... Saving
File 9_opened opened ... Transforming
File 2_opened_transformed transformed ... Saving
File 9_opened_transformed transformed ... Saving
File 4_opened_transformed_saved completed ...
File 11_opened_transformed_saved completed ...
File 6_opened_transformed_saved completed ...
File 7_opened_transformed_saved completed ...
File 8_opened_transformed transformed ... Saving
File 1_opened_transformed transformed ... Saving
File 12_opened_transformed transformed ... Saving
File 8_opened_transformed_saved completed ...
File 5_opened_transformed transformed ... Saving
File 9_opened_transformed_saved completed ...
File 10_opened_transformed_saved completed ...
File 5_opened_transformed_saved completed ...
File 3_opened_transformed_saved completed ...
File 2_opened_transformed_saved completed ...
File 12_opened_transformed_saved completed ...
File 1_opened_transformed_saved completed ...

关于javascript - Promise 链拆分以执行多个异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764123/

相关文章:

asynchronous - 为什么 time.sleep 不在 Tornado 协程中并行运行?

javascript - 在内联脚本之后如何正确注册 yii2 项目中的 js 代码?

javascript - 外部JS和浏览器

javascript - Socket.io 全局发送函数 - Node.js

javascript - Browserify 不提供要求

c# - 使用 async 和 await 的最佳性能

javascript - 使用javascript在鼠标悬停时停止动画

javascript - 奇怪的 js 评估/模板字符串行为

node.js - 在sequelize中调用存储过程传入​​参数

asynchronous - 从异步函数内部更改 Elmish.WPF 模型