【问题标题】:Promises in functions, angularjs函数中的承诺,angularjs
【发布时间】:2016-05-30 10:49:31
【问题描述】:

如果可能的话,如何在函数中实现承诺,以便我可以摆脱超时?我从工厂“Prim”获取一些数据,函数看起来像:

$scope.getPre = function(id){

 var url = WEB_API.MainUrl + '/api/prim/' + id +'/' + $window.sessionStorage.getItem('idsom');

    Prim.getprim(function(data) {

        $scope.prim1 = data;
        $scope.prim = $scope.prim1[0];

    }, url); 

    $scope.$apply();

}

以及我想摆脱的超时:

setTimeout(function() { // it can't work without timeout
    $scope.getPre($routeParams.idprim);
}, 100);

【问题讨论】:

  • 使用回调,会更干净
  • 唯一的选项是promise,项目中有更多的超时,我必须更改promise,如果我使用回调它会不可读并且更复杂
  • var promise = new Promise((res, rej) => { foo(/* callback */ res); }); 其中foo 是你需要等待的异步事件,它需要回调,然后在你的代码中你有setTimeouts 的其他地方你改为使用promise.then(() => /* ... */);跨度>
  • 这里的重点不是承诺/回调/什么,重点是同步与异步。为什么都依赖超时?直接调用 getPre 会出现什么问题?

标签: javascript angularjs promise


【解决方案1】:

你的函数应该返回一个承诺,所以你可以在上面使用.then()

$scope.getPre = function(id){
    var deferred = $q.defer()
    var url = WEB_API.MainUrl + '/api/prim/' + id +'/' + $window.sessionStorage.getItem('idsom');

    Prim.getprim(function(data) 
        $scope.prim1 = data;
        $scope.prim = $scope.prim1[0];
        deferred.resolve();
    }, url);

    return deferred.promise;
}

然后像这样使用它:

$scope.getPre($routeParams.idprim).then(function () {
    // Do whatever you did after setTimeout
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多