请教关于promise与aysnc/await混用问题
发布于 5 年前 作者 helloHT 4871 次浏览 来自 问答

let func = function(){ reuturn new Promise( async (resolve, reject) => { await p1(); }) } 像这种写法,把async写在这里是否合适?

8 回复

p1 完了resolve不就好了,或者里面没有其他异步的话直接resolve(p1()),,你这个是什么写法。。

@ganshiqingyuan 就是想在promise内用await,可能要await多个

@ganshiqingyuan let func = async function(){ try{ await p1(); await p2(); await p3(); return …; }catch(err){ 这里的报错如何被调用者捕获? 比如:return Promise.reject();??? } }

方式一: let func1 = async function(){ try { let a = await p1; let b = await p2; return Promise.resolve(); } catch (error) { return Promise.reject(); } } 方式二: let func2 = function(){ return new Promise(async (resolve, reject) => { try { let a = await p1; let b = await p2; resolve(); } catch (err) { reject(); } }) } 以上两种写法呢?是否合理?

await多个用 promise.all ,不是你这样写的

@phpsmarter 我需要方法的串行。然后需要将上面比如func2的结果返回出去给调用者,调用者也可以用await来获取结果

async function throwError() { 1+1n; }

let func = async function(){
		try{
			await throwError();
			return 123;
		}catch(err){
			throw err; // 直接丢出去
		}
}

// 在普通函数中捕获
func().catch(e =>console.log(`catch ${e}`)); // catch TypeError: Cannot mix BigInt and other types, use explicit conversions

// 在async中捕获
(async() => {
	try {
	  await func();
  } catch (e) {
	console.log(`catch ${e}`); // catch TypeError: Cannot mix BigInt and other types, use explicit conversions
  }
})()


const compose = (...functions) => input => functions.reduceRight((chain, func) => chain.then(func), Promise.resolve(input))
compose(insertDataWaitForData, getArray, getDataFromMediumWaitForUrl)(input)
//上面的方法就是传入Medium网站url,从返回数据获得数组,然后插入数据库. 都是异步操作. 

异步操作compos方法 ,里面的reduceRight是Ramda库的方法,Ramda库里应该还有直接拿来用的函数.

回到顶部