С вашим исправленным кодом, в котором вы выполняете работу до вызова p2
, у вас есть несколько вариантов.Если вы рады, что ошибки в начальной, синхронной части вашего functino являются синхронными ошибками, а не обещаниями отклонения, вы можете просто сделать это:
function p1(val) {
//do something with val
if (val == true)
throw err;
return p2();
}
Первая часть этого происходит синхронно, затем возвращаетсяобещание от p2
.То, что вы делаете, частично зависит от того, что делает функция, и частично от стиля.Если начальная синхронная часть настраивает асинхронную операцию, и вы хотите, чтобы функция throw (а не возвращала отклоненное обещание) при возникновении проблемы при настройке асинхронного процесса (затем выполните / отклоните в зависимости от того, работал ли асинхронный процесс).), вы можете сделать это следующим образом.
Если вы хотите, чтобы функция всегда сообщала об успехе / неудаче с помощью обещания, то если вы выполняете начальную работу, вам нужно ваше собственное обещание:
function p1(val) {
return new Promise((resolve, reject) => {
//do something with val
if(val == true)
reject(err);
resolve(p2());
});
}
Часть resolve(p2())
разрешает обещание p1
, созданное для обещания p2
: если обещание p2
отклоняется, обещание p1
отклоняется с причиной отклонения p2
;если обещание p2
выполняется, обещание p1
выполняется со значением выполнения p2
.
Или вы можете использовать функцию async
, которая имеет тот же результат:
async function p1(val) {
//do something with val
if(val == true)
throw err;
return p2();
}
В обоих случаях это гарантирует, что любая ошибка, выданная исходным кодом до p2
, приведет к отклонению, а не к синхронной ошибке, даже если исходный код не включает асинхронную обработку.
Главное, что нужно помнить, это то, что когда у вас уже есть обещание (например, из p2
), нет необходимости использовать new Promise
;вместо этого просто зацепите обещание, которое вы уже имеете.( Подробнее здесь .) Но когда вы делаете что-то до , вы получаете обещание, как в вашем пересмотренном примере, вы можете создать свое собственное в зависимости от того, хотите ли вы первую частьошибки вашей функции должны быть синхронными или обещать отклонение.