Java教程

按顺序读取Promise

本文主要是介绍按顺序读取Promise,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

有一个文件列表,要按顺序读写文件,用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()并行地一次性进行解析

这篇关于按顺序读取Promise的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!