Javascript 函数中的承诺,angularjs

Javascript 函数中的承诺,angularjs,javascript,angularjs,promise,Javascript,Angularjs,Promise,如果可能的话,如何将承诺实现到函数中,这样我就可以摆脱超时?我从工厂“Prim”中获得一些数据,函数看起来像: $scope.getPre = function(id){ var url = WEB_API.MainUrl + '/api/prim/' + id +'/' + $window.sessionStorage.getItem('idsom'); Prim.getprim(function(data) { $scope.prim1 = data;

如果可能的话,如何将承诺实现到函数中,这样我就可以摆脱超时?我从工厂“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);

您的函数应该返回一个承诺,这样您就可以在其上使用
.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
});

使用回调,这将是干净的选择是承诺,在项目中有更多的超时,我必须改变承诺,如果我使用回调,它将是不可读和更复杂的
var promise=newpromise((res,rej)=>{foo(/*callback*/res);})
where
foo
是您需要等待的异步对象,它接受回调,然后在代码中的其他地方设置超时,而不是执行
promise这里的重点不是承诺/回调/什么,重点是同步与异步。为什么要依赖超时?当您直接调用getPre时,什么失败了?