2016-11-18 7 views
1

Я хочу быть в состоянии поймать исключение, заброшенное внутри обещания, вне функции этого обещания. Смотрите следующий код:Как уловить внутреннее исключение?

throwError =() => { 
    throw new Error("myError"); 
}; 


let iWantToCatchTheErrorThatThisOneThrows =() => { 
    return (new Promise((resolve) => { 
     resolve() 

    }).then(() => { 
     (new Promise((resolve, reject) => { 
      return throwError(); 
     })); 
     return new Promise((resolve) => setTimeout(resolve, 1000)); 
    })).catch((error) => { 
     //Never reaches here 
     console.log(error) 
    }); 
}; 

iWantToCatchTheErrorThatThisOneThrows().then(() => { 
    console.log("Quit gracefully"); 
}).catch((error) => { 
    //Never reaches here 
    console.log(error); 
}); 

я могу поймать внутреннюю ошибку, но я не могу бросить его в конечном итоге, где я хочу (в конце концов), путем добавления задвижки в середине:

let iWantToCatchTheErrorThatThisOneThrows =() => { 
    return (new Promise((resolve) => { 
     resolve() 

    }).then(() => { 
     (new Promise((resolve, reject) => { 
      return throwError(); 
     })).catch((error) => { 
      //Prints, but thrown error isn't bubbled anywhere 
      console.log(error); 
      throw new Error(error); 
     }); 
     return new Promise((resolve) => setTimeout(resolve, 1000)); 
    })).catch((error) => { 
     //Never reaches here 
     console.log(error) 
    }); 
}; 

iWantToCatchTheErrorThatThisOneThrows().then(() => { 
    console.log("Quit gracefully"); 
}).catch((error) => { 
    //Never reaches here 
    console.log(error); 
}); 

Все тесты выполняются в Nodejs 7.1.0

+0

Во внутреннем обратном вызове вы делаете все виды метания и повторного броска, а затем возвращаете несвязанное, разрешенное обещание. Не должно быть удивления, что внешнему '.catch()' нечего ловить. –

ответ

0

Я понял, что мой вопрос необоснован, поскольку я хочу отклонить обещание, которое уже разрешено. Проблема в том, что я хочу немедленно перейти от обещания и не дожидаться его разрешения/броска. Более наглядным примером может быть следующее:

writeToDatabase =() => { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      if (hasPermissions) { 
       resolve() 
      } else { 
       reject(); 
      } 
     }, 1000) 
    }); 
}; 


let iWantToCatchTheErrorThatThisOneThrows =() => { 
    return new Promise((resolve) => { 
     resolve() 
    }).then(() => { 
     //Don't want to wait for this to complete 
     //but want to catch the error in later catch clauses 
     //Unfortunately, this is unreasonable since I can't reject 
     //a promise that might already have been resolved. 
     //Therefore, refactor to have the same method to handle error 
     writeToDatabase().catch(handleError); 

     return Promise.resolve(); 
    }).catch((error) => { 
     //Will not catch the database error, since it's already resolved 
     console.log('err', error) 
    }); 
}; 

iWantToCatchTheErrorThatThisOneThrows().then(() => { 
    console.log("Quit gracefully"); 
}).catch((error) => { 
    // Will not catch the database error, since it's already resolved 
    // Instead, we can reuse the same error handling function 
    handleError(error); 
}); 
1

Изменить код следующим образом: -

throwError =() => { 
throw new Error("myError"); 
}; 


let iWantToCatchTheErrorThatThisOneThrows =() => { 
    return new Promise((resolve) => { 
     resolve() 
    }).then(() => { 
     //since you are resolving promise , this will be called 
     return Promise.reject('err') 
     // returning rejection so we can catch later 
    }).catch((error) => { 
      //It will not be called unless some error is thrown 
      console.log('err',error) 
    }); 
}; 

iWantToCatchTheErrorThatThisOneThrows().then(() => { 
    console.log("Quit gracefully"); 
    }).catch((error) => { 
    // Since a rejection is returned by function , it is called 
    console.log(error); 
}); 

Или, если вы хотите, т o ошибка выброса: -

throwError =() => { 
    throw new Error("myError"); 
}; 

let iWantToCatchTheErrorThatThisOneThrows =() => { 
    return new Promise((resolve) => { 
    resolve() 

    }).then(() => { 

    return throwError(); 

    }).catch((error) => { 
    //Reaches 
    console.log('err',error) 
    //Rejection returned to catch later 
    return Promise.reject('rejection from catch') 
    }); 
}; 

iWantToCatchTheErrorThatThisOneThrows().then(() => { 
    console.log("Quit gracefully"); 
}).catch((error) => { 
    //rejection caught 
    console.log(error); 
}); 
+0

Он не полностью применим к моему прецеденту, так как это требует от меня ждать обещания, которое выдает ошибку – Karamell