Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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承诺链w.r.t特定示例_Javascript_Angularjs_Angular Promise - Fatal编程技术网

Javascript 理解角度$q承诺链w.r.t特定示例

Javascript 理解角度$q承诺链w.r.t特定示例,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我有一个与这段代码相关的简单查询: 服务代码: function getUser($q, $http) { return $http.get('...').then(function(response) { return response.data; }); } // getUser's consuming code getUser().then( function(data) { // Success callback // Do something about

我有一个与这段代码相关的简单查询:

服务代码:

function getUser($q, $http) {
  return $http.get('...').then(function(response) {
    return response.data;
  });
}
// getUser's consuming code
getUser().then(
  function(data) { // Success callback
    // Do something about data
  },
  function(response) { // Error callback
    // How does this error callback gets called ??
  }
);
控制器代码:

function getUser($q, $http) {
  return $http.get('...').then(function(response) {
    return response.data;
  });
}
// getUser's consuming code
getUser().then(
  function(data) { // Success callback
    // Do something about data
  },
  function(response) { // Error callback
    // How does this error callback gets called ??
  }
);
以防get users http调用中出现错误。我无法理解如何(内部工作)在控制器中调用错误回调。
我问这个问题的原因是因为我认为我们必须在服务然后错误回调中调用拒绝方法(在延迟对象上),以便调用后续然后错误回调(控制器中的那一个)

i、 e


但是,当我们不返回与错误对应的第一个然后错误回调(服务内部的回调)中的任何内容时,控制器的然后错误回调如何调用。

内部工作如下:
然后
返回一个新承诺,等待原始承诺得到解决,及

  • 如果原来的问题解决了

    • 若已注册解析回调,则调用回调并使用回调返回的值自行解析

    • 如果尚未注册解析回调,则使用原始承诺的解析值进行解析

  • 如果原件被拒绝

    • 如果已注册拒绝回调,则调用回调并使用回调返回的值拒绝自己

    • 如果您尚未注册拒绝回调,则使用原始承诺提供的拒绝值拒绝自己

您可以想象
的实现是非常粗略的,概念上大致如下:

function then(whenResolved, whenRejected) {
    return new Promise(function(resolve, reject) {
        whenOriginalIsResolved(function(resolution) {
            if (typeof whenResolved === "function") {
                try {
                    resolution = whenResolved(resolution);
                } catch (e) {
                    reject(e);
                    return;
                }
            }
            resolve(resolution);
        });
        whenOriginalIsRejected(function(rejection) {
            if (typeof whenRejected === "function") {
                try {
                    rejection = whenRejected(rejection);
                } catch (e) {
                    reject(e);
                    return;
                }
            }
            reject(rejection);
        });
    });
}

同样,这是概念性的,不是字面意义上的。如果您希望看到文字实现,那么Kris Kowal的原始Q将实现它。(这比Angular使用的轻量级版本稍微复杂一些,但这是一个很好的例子。)

这就是承诺的工作原理。如果您有类似于
promiseA.then(promiseB).then(promiseB).then(promiseC).then(promiseC).then(success,failure)
promiseB
拒绝的代码,那么
promiseC
promiseD
将被跳过,并且
failure
方法将被禁用executed@KirillSlatin所以,基本上如果发生了一些错误,然后调用下一个可用的失败方法,而不管下一个then方法是否拥有它或链中的任何其他then??是的,@bhavya_w,就是这样correct@bhavya_w:我是按承诺说话的。:-)请记住,您的代码使用了两个不同的承诺(并创建了第三个承诺,但除非您使用
getUser.then
的返回值,否则我们可以忽略它)。承诺1是您从
$http
获得的承诺。承诺2是您通过呼叫承诺1的
然后
得到的承诺。因为对
$http.then
的调用不会给出拒绝处理程序,所以当
then
创建承诺2时,它会将该承诺设置为在承诺1被拒绝时自动拒绝自己。例如,默认设置为链。