2016-08-31 5 views
2

以下のコードでは、Pouch.sync()を呼び出しています。このチェーンには、deleteLocal()があります。 Pouch.sync()は約束を返さないlocalDb.sync()を実行しますが、エラー処理のために.on()イベントハンドラを添付することができます。

私は$ q.whenと$ q.rejectで試してみましたが、同期に失敗した場合はdeleteLocal()が起動しないようにすることはできません。また、onError()はエラーコールバックまたはcatchステートメント)。

// Controller 
function _onSyncClick() { 
    return Pouch.sync() 
     .then(deleteLocal, onError); // I do not want deleteLocal() to execute if Pouch.sync() fails 
     .catch(onError); 
} 


// Pouch service 
function sync() { 
    return 
     localDb.sync(remoteDb) 
      .on('error', function (err) { 
       return $q.reject('Sync error.'); 
      }); 
} 

答えて

0

.synch()コールバックAPIを使用して、あなたはそれをpromisifyする$q.when$q.rejectを使用することができます。約束を連鎖するとき

return localDB.sync(remoteDB).on('complete', function() { 
    return $q.when("done!"); 
}).on('error', function (err) { 
    return $q.reject(err); 
}); 

はまた、あなたがそうでなければ、あなたがresolve/successハンドラをトリガします、あなたはthrowエラーまたは拒否約束を返すのいずれかを確認する必要があります。

それは かPouch.sync()あなたの関数を呼び出すことはなかったでしょうけれどものでどちらか.on('error', errorHandler)はあなたのように走っていませんでした。

+0

ありがとうございます。私は '$ q.reject()'をエラーハンドラで返しましたが、連鎖した関数はまだ実行されていました。ブレークポイントを使用して、エラーハンドラに実際に到達したが、エラーの後で 'deleteLocal()'がまだ実行されていることを確認しました。 '$ q.reject()'がチェーンを破らなかったのはなぜですか? – devthorne

+0

私は2回目に誤って '.when'を使用しました。答えは – svarog

+0

ですが、エラー後にdeleteLocal()がまだ実行されています。'私の推測では、関数は 'localDB.sync'によって呼び出されました。あなたは約束のハンドラーを成功と拒否の両方で実行することはできません – svarog

0

最初にthen()onErrorでに電話をかけてはなりません。

次に、Angularのドキュメントに基づいて:約束エラーコールバックでエラーを「キャッチ」し、そのエラーを現在の約束から得られる約束に転送したい場合は、エラーを「再スロー」する必要があります。 $q.reject

コールバックイベントをプロミスとして扱っているため、却下していない理由が考えられます。

私が考えている適切な方法はから$qコンストラクタを使用してコールバックイベントを通知することです。

// Controller 
function _onSyncClick() { 
    return Pouch.sync().then(deleteLocal).catch(onError); 
} 

// Pouch Service, method sync 
function sync() { 
    return $q(function (resolve, reject) { 
    localDb.sync(remoteDb, { 
     // options 
    }).on('complete', function (info) { 
     resolve(info); 
    }).on('error', function (err) { 
     reject(err); 
    }); 
    }); 
} 

だけに言及し、$q.whenは値または(サードパーティ)であるかもしれないオブジェクトをラップ$ qを約束にそして可能な約束、ラップするためにそれを使用し、解決としてそれを使用しないでくださいPouchDBは約束します。

関連する問題