用Promise让Node的异步任务顺序执行
2016-07-31 13:56
316 查看
Node的机制导很多的任务执行是异步的,一般用回调处理任务的结果。多任务就会导致多层嵌套。
于是Promise就被用来处理这个事情。尤其是
如果需要一大串的任务全部执行完成之后继续后面的,那么就用
这两个方法组合起来就可以发挥更加大的威力:
首先使用
来看看怎么用的。
注意:
于是Promise就被用来处理这个事情。尤其是
bluebird的Promise实现功能丰富。
如果需要一大串的任务全部执行完成之后继续后面的,那么就用
Promise.all方法,如果要任务顺序执行,并把每次的结果单独处理就用
Promise.reduce方法。
这两个方法组合起来就可以发挥更加大的威力:
/** * # Pipeline Utility * * Based on pipeline.js from when.js: * https://github.com/cujojs/when/blob/3.7.4/pipeline.js */ var Promise = require('bluebird'); function pipeline(tasks /* initial arguments */) { var args = Array.prototype.slice.call(arguments, 1), runTask = function (task, args) { // Self-optimizing function to run first task with multiple // args using apply, but subsequent tasks via direct invocation runTask = function (task, arg) { return task(arg); }; return task.apply(null, args); }; // Resolve any promises for the arguments passed in first return Promise.all(args).then(function (args) { // Iterate through the tasks passing args from one into the next return Promise.reduce(tasks, function (arg, task) { return runTask(task, arg); }, args); }); } module.exports = pipeline;
首先使用
Promise.all把参数都转化成一个个的
Promise然后,用
Promise.reduce挨个执行任务,并且把每一个任务的结果依次传递到下一个任务。
来看看怎么用的。
function modelQuery(options) { return dataProvider.Post.findPage(options); } // Push all of our tasks into a `tasks` array in the correct order tasks = [ utils.validate(docName, {opts: permittedOptions}), utils.handlePublicPermissions(docName, 'browse'), utils.convertOptions(allowedIncludes), modelQuery ]; // Pipeline calls each task passing the result of one to be the arguments for the next return pipeline(tasks, options);
注意:
tasks数组的每一个成员都返回一个方法。所以
tasks是一个
Function数组。是一组“任务”。
相关文章推荐
- Promise 异步函数顺序执行
- LazyMay:实现同步和异步任务的顺序执行
- Node.js的那些坑(四)——如何让异步并发方法同步顺序执行
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- 详解如何构建Promise队列实现异步函数顺序执行
- 使用GCD异步和同步执行任务
- Java 如何在Main函数中,执行完异步任务后才退出主线程
- ajax回调函数执行顺序带来的同步异步问题
- Thread Runnable建立新线程 Handler AsycTask执行异步任务(不一定建立新的线程)
- ajax回调函数执行顺序带来的同步异步问题
- celery配合rabbitmq任务队列实现任务的异步调度执行
- Android中AsyncTask(异步执行任务)的使用
- ajax回调函数执行顺序带来的同步异步问题
- node.js开发之函数嵌套使其顺序执行
- js 异步操作,回调函数控制执行顺序
- js 异步操作回调函数如何控制执行顺序
- android handler的两种用法(一种UI线程,另一种用于执行异步任务)
- ajax回调函数执行顺序带来的同步异步问题
- ajax回调函数执行顺序带来的同步异步问题
- 异步或多线程支持一个任务执行完成