有一个文件列表,要按顺序读写文件,用for循环读取,不能用forEach
async function printFiles () {
let fileNames = ['picard', 'kirk', 'geordy', 'ryker', 'worf'];
for (const file of fileNames) {
const contents = await fs.readFile(file, 'utf8');
console.log(contents);
}
}
async function someFunction(items) {
items.forEach( async(i) => {
const res = await someAPICall(i);
console.log('--->', res);
});
}
function someAPICall(param) {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve("Resolved" + param)
},param);
})
}
someFunction(['3000','8000','1000','4000']);
forEach 循环不是按顺序进行API调用,而是一个接一个连续地调用API,中间不等待前一个调用完成。
可以使用reduce 函数来遍历数组并按顺序解析promise
function testPromise(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`Processing ${time}`);
resolve(time);
}, time);
});
}
let result = [3000,2000,1000, 4000].reduce( (accumulatorPromise, nextID) => {
return accumulatorPromise.then(() => {
return testPromise(nextID);
});
}, Promise.resolve());
result.then(e => {
console.log("All Promises Resolved !!?")
});
按顺序解析promise的另一种方法是使用异步生成器?
async function* readFiles(files) {
for(const file of files) {
yield await readFile(file);
}
};
并行解析Promise---想要并行读取,而不是按顺序读取文件
不关心内容在控制台中的打印顺序。因此就可以将Promise.all() 函数与map 一起使用
async function printFiles () {
let fileNames = ['picard', 'kirk', 'geordy', 'ryker', 'worf'];
await Promise.all(fileNames.map(async (file) => {
const contents = await fs.readFile(file, 'utf8');
console.log(contents);
}));
}
每个async 回调函数调用都会返回一个promise,我们将它们保存起来,并与Prmiss.all() 并行地一次性进行解析
|