如何在Angular.js中链接.then函数和回调成功函数

时间:2016-05-12 05:08:00

标签: javascript angularjs promise chaining

我正在尝试链接嵌套的.then函数并调用成功函数,但回调是在启动时调用。

//public method fn
function fn(callback) {
//calling the 1st API request
fn1()
  .then(function(response) {
    //2nd API request function
    call1(response);
  }, function(error) {
    return $q.reject({
    responseStatus: error.status
  });

  })
  // Returning response
  .then(function(response) {
    callback({
    responseStatus: 200
    });
  }, function(error) {
    callback({
      responseStatus: 500
    });
  });
}

function call1(response) {
  //2nd API
  fn2()
    .then(function(response) {
     //3rd API request function
        call2(response);
      }, function(error) {
        return $q.reject({
        responseStatus: error.status
      });
    });
}


function call2(response) {
  //3rd API request 
  fn3()
    .then(function(response) {
        return lastfunction();
      //here i need to callback the success  response status
      }, function(error) {
        return $q.reject({
        responseStatus: error.status
      });
    });
}


function fn1(){
 //some code 
 }
function fn2(){
//some code 
}
function fn3(){
//some code 
}

//Controller

//i will show response status callback here

if(response.status ==200){
  show output;
 }
 else{
  //response 500
  show errors;
  }

基本上我需要在所有服务调用成功时将“200”响应状态回调给其他控制器,即使一个请求失败,我也需要发送“500”。我的代码'响应状态'200'正在调用第一个.then函数本身。我想将此服务调用称为que

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:6)

您的{ responseStatus: x }对象仅用于流量控制,可以由返回的承诺的成功路径错误路径自然提供。 fn();

此外,对于承诺,没有必要将回调传递给fn() - 事实上这被认为是不好的做法。

首先,

  • 清除callback全部通过
  • 从每个低级别函数返回一个承诺
  • 简化成功链接
  • 清除不必要的错误处理程序
function fn() {
    return fn1().then(call1);
}
function call1() {
    return fn2().then(call2);
}
function call2() {
    return fn3().then(lastfunction);
}
function fn1() {
    //some code that returns a promise
}
function fn2() {
    //some code that returns a promise
}
function fn3() {
    //some code that returns a promise
}

然后,请致电如下:

fn().then(function(response) {
    // success callback (your "200" condition)
    // show output;
}).catch(function(error) {
    // error callback (your "500" condition)
    // show error;
});

response var将是lastfunction()传递的内容。如果您希望response成为由fn1()尚未提供的fn2()fn3()lastfunction()提供的内容的汇总,则会出现问题。该问题得到了全面解决here

error var将是执行Error过程中发生的第一个fn(),不会丢失任何信息; <{1}}和error.message(如果存在)可以被阅读/显示。

答案 1 :(得分:2)

您需要返回您创建的承诺才能正确链接它们。请记住,当您使用.then()而不是修改承诺时,您需要在链中构建新的承诺。

返回承诺的代码(格式化我的):

function fn(callback) {
  return fn1()
    .then(function(response) {
      return call1(response);
    }, function(error) {
      return $q.reject({
      responseStatus: error.status
    });

    })
    // Return response
    .then(function(response) {
      callback({
        responseStatus: 200
      });
    }, function(error) {
      callback({
        responseStatus: 500
      });
    });
}

function call1(response) {
  return fn2()
    .then(function(response) {
        return call2(response);
      }, function(error) {
        return $q.reject({
        responseStatus: error.status
      });
    });
}


function call2(response) {
  return fn3()
    .then(function(response) {
        return lastfunction();
      //here i need to callback the success  response status
      }, function(error) {
        return $q.reject({
        responseStatus: error.status
      });
    });
}


function fn1(){
 //some code 
 }
function fn2(){
//some code 
}
function fn3(){
//some code 
}