Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用$q.reject停止链的执行_Javascript_Angularjs_Pouchdb - Fatal编程技术网

Javascript 使用$q.reject停止链的执行

Javascript 使用$q.reject停止链的执行,javascript,angularjs,pouchdb,Javascript,Angularjs,Pouchdb,在下面的代码中,我正在调用backy.sync(),我将deleteLocal()链接到它pocket.sync()执行localDb.sync(),它不返回承诺,但我可以附加.on()事件处理程序来处理错误 我尝试过使用$q.when和$q.reject,但如果同步失败,我似乎无法阻止deleteLocal()触发,并且onError()从不执行(作为错误回调或在catch语句中) .synch()使用回调API,您可以使用$q.when和$q.reject来提示它 return localD

在下面的代码中,我正在调用
backy.sync()
,我将
deleteLocal()
链接到它
pocket.sync()
执行
localDb.sync()
,它不返回承诺,但我可以附加
.on()
事件处理程序来处理错误

我尝试过使用$q.when和$q.reject,但如果同步失败,我似乎无法阻止
deleteLocal()
触发,并且
onError()
从不执行(作为错误回调或在catch语句中)

.synch()
使用回调API,您可以使用
$q.when
$q.reject
来提示它

return localDB.sync(remoteDB).on('complete', function () {
   return $q.when("done!");
}).on('error', function (err) {
   return $q.reject(err);
});
此外,在链接承诺时,您需要确保
抛出错误或返回拒绝的承诺,否则将触发
解决
/
成功
处理程序

所以无论是
.on('error',errorHandler)
都没有像您想象的那样运行 或者
backy.sync()
没有调用您的函数。

首先您的
然后()
不应该使用
onError调用
deleteLocal

接下来,根据Angular文档:如果您通过promise error回调“捕获”错误,并且希望将错误转发到从当前promise派生的promise,那么您必须通过返回通过
$q.reject构建的拒绝来“重试”错误

因此,您将回调事件视为承诺,这可能就是为什么不使用拒绝

我认为正确的方法是使用
$q
构造函数从
sync()
发出回调事件

// 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。当
将一个可能是值或(第三方)的对象包装成$q承诺时,不要将其用作解决方案,使用它包装PockDB承诺。

谢谢。我确实在错误处理程序中返回了
$q.reject()
,但链式函数仍在执行。使用断点,我确认错误处理程序确实已到达,但在错误发生后仍执行
deleteLocal()。为什么
$q.reject()
没有打破这个链条?我不小心使用了
。第二次
时,我编辑了我的答案
,但在出错后仍然执行deleteLocal()。
,我猜该函数是由
localDB.sync
调用的。你不能既成功又拒绝承诺
// 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);
    });
  });
}