Skip to content

Commit

Permalink
fix(plugin): handle rejection when Cordova is undefined
Browse files Browse the repository at this point in the history
Zone.js now (helpfully) throws an error on unhandled rejections in
promises. This is great because they no longer silently fail, but we
were relying on that behavior for the case where the plugin isn't
installed or Cordova isn't available. With this change, those cases
won't throw an unhandled rejection error, but all regular plugin errors
still should.
  • Loading branch information
tlancina committed Apr 27, 2016
1 parent 91117fa commit db07768
Showing 1 changed file with 20 additions and 9 deletions.
29 changes: 20 additions & 9 deletions src/plugins/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,17 +81,15 @@ function callCordovaPlugin(pluginObj:any, methodName:string, args:any[], opts:an
// Do this check in here in the case that the Web API for this plugin is available (for example, Geolocation).
if(!window.cordova) {
cordovaWarn(pluginObj.name, methodName);
reject && reject({
return {
error: 'cordova_not_available'
});
return;
}
}

pluginWarn(pluginObj, methodName);
reject && reject({
return {
error: 'plugin_not_installed'
});
return;
};
}

// console.log('Cordova calling', pluginObj.name, methodName, args);
Expand All @@ -118,14 +116,27 @@ function getPromise(cb) {
}

function wrapPromise(pluginObj:any, methodName:string, args:any[], opts:any={}) {
return getPromise((resolve, reject) => {
callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject);
})
let pluginResult, rej;
const p = getPromise((resolve, reject) => {
pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject);
rej = reject;
});
// Angular throws an error on unhandled rejection, but in this case we have already printed
// a warning that Cordova is undefined or the plugin is uninstalled, so there is no reason
// to error
if (pluginResult && pluginResult.error) {
p.catch(() => {});
rej(pluginResult.error);
}
return p;
}

function wrapObservable(pluginObj:any, methodName:string, args:any[], opts:any = {}) {
return new Observable(observer => {
let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
if (pluginResult && pluginResult.error) {
observer.error(pluginResult.error);
}

return () => {
try {
Expand Down

0 comments on commit db07768

Please sign in to comment.