javascript - 组合多个 API 调用和处理后从工厂方法返回 promise

标签 javascript angularjs promise

很长一段时间以来,我一直在使用简单的 http 方法返回的 promise 。但是我需要首先链接多个 API 调用并处理数据并返回该数据。我在当前实现中面临的问题是工厂没有返回 promise ,因此没有等待数据并执行 Controller 的下一行。

app.factory('mytestService', ['$http', function($http){
    getSomeDataById: function(id){
    var userAllProjects = [];
     var myHelperService = this.getSecondData;
     this.getFirstData(id).then(function(response){ // first api call
         var idObjectValue = response['result'][0]['id'];
         myHelperService(idObjectValue).then(function(response){ //second api call
           userAllProjects= response['projectList']
        });
   });
    return userAllProjects
   }
]);

当我这样做时现在在 Controller 中:

$scope.allProjects = mytestService.getSomeDataById(1234);
console.log($scope.allProjects);

控制台打印未定义。我知道这是因为,它不会等待服务完成并执行下一行。

我是 Angular Promise 的新手,所以不知道如何处理它。任何人都可以在这里帮助我。 如果您需要任何进一步的信息,请告诉我。

最佳答案

引入 Promise Chaining,它通常优于创建新的 deferred

getSomeDataById: function(id){
    var userAllProjects = [];
    var myHelperService = this.getSecondData;

    // returning promise rather than creating a new one, 
    // to prevent unresolved promise if one of the calls in the chain gets rejected
    return this.getFirstData(id).then(function(response){ // first api call
        var idObjectValue = response['result'][0]['id'];
        return myHelperService(idObjectValue);  //second api call
        // instead of writing .then here, 
        // it can be moved to the outer layer for easy reading

    }).then(function(response){
        userAllProjects = response['projectList'];
        // return something you need to use in .then of getSomeDataById() here
    });
});

关于javascript - 组合多个 API 调用和处理后从工厂方法返回 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40655105/

相关文章:

javascript - 不要更改 .then() 中的解析值

javascript - 启动和停止 gulp-webserver

javascript - 如何动态添加元素到<li>?

javascript - 谷歌计划 : Polymer & Angular

javascript - 将 Promise 中的值传递或访问 API

angularjs - 停止 Angular-ui-router 导航,直到 promise 得到解决

javascript - bootstrappedUser - Jade 或 EJS 到 HTML

javascript - 如何将 javascript 重定向加载到 android webview 中?

javascript - Sails.js 上传后如何获取图像的名称

javascript - 尽管调用了 `close()`,但服务器发送的事件连接并未关闭