3 回答
TA贡献1887条经验 获得超5个赞
async function readFiles(files) {
for(const file of files) {
await readFile(file);
}};async function* readFiles(files) {
for(const file of files) {
yield await readFile(file);
}};var readFiles = function(files) {
var p = Promise.resolve(); // Q() in q
files.forEach(file =>
p = p.then(() => readFile(file));
);
return p;};var readFiles = function(files) {
return files.reduce((p, file) => {
return p.then(() => readFile(file));
}, Promise.resolve()); // initial};var Promise = require("bluebird");var fs = Promise.promisifyAll(require("fs"));
var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 });
// if the order matters, you can use Promise.each instead and omit concurrency paramreadAll.then(function(allFileContents){
// do stuff to read files.});TA贡献1811条经验 获得超4个赞
function runSerial() {
var that = this;
// task1 is a function that returns a promise (and immediately starts executing)
// task2 is a function that returns a promise (and immediately starts executing)
return Promise.resolve()
.then(function() {
return that.task1();
})
.then(function() {
return that.task2();
})
.then(function() {
console.log(" ---- done ----");
});}
有更多任务的案子呢?比如,10?
function runSerial(tasks) {
var result = Promise.resolve();
tasks.forEach(task => {
result = result.then(() => task());
});
return result;}TA贡献1936条经验 获得超7个赞
reduce.
reduce
reducePromise.resolve([])
reducepromisefuncthenreduce
/*
* serial executes Promises sequentially.
* @param {funcs} An array of funcs that return promises.
* @example
* const urls = ['/url1', '/url2', '/url3']
* serial(urls.map(url => () => $.ajax(url)))
* .then(console.log.bind(console))
*/const serial = funcs =>
funcs.reduce((promise, func) =>
promise.then(result => func().then(Array.prototype.concat.bind(result))), Promise.resolve([]))// broken down to for easier understandingconst concat = list => Array.prototype.concat.bind(list)const promiseConcat = f => x
=> f().then(concat(x))const promiseReduce = (acc, x) => acc.then(promiseConcat(x))/*
* serial executes Promises sequentially.
* @param {funcs} An array of funcs that return promises.
* @example
* const urls = ['/url1', '/url2', '/url3']
* serial(urls.map(url => () => $.ajax(url)))
* .then(console.log.bind(console))
*/const serial = funcs => funcs.reduce(promiseReduce, Promise.resolve([]))// first take your workconst urls = ['/url1', '/url2', '/url3', '/url4'] // next convert each item to a function that returns a promiseconst funcs = urls.map(url => () => $.ajax(url)) // execute them seriallyserial(funcs) .then(console.log.bind(console))
添加回答
举报
