在使用promise链接方法时,如何确保变量不为null?

时间:2019-05-11 17:01:54

标签: javascript angularjs angularjs-scope angular-promise angularjs-service

我正在如下使用init

$scope.init = function () {
    $scope.getAllDetails();
};

$scope.getAllDetails= function () {
    $http({
        method: "GET",
        url: "api/endpoint"
    }).then(function mySuccess(response) {
            $scope.processData();
        }, function myError(response) {
            console.log(response.statusText);
        }
    );
};

$scope.processData() = function() {
//Logic to calculate var1
// var1 is then passed to $scope.getID to make call to Service1.getId(var1)

}

我有第一个返回诺言的函数:

$scope.getID = function() {
    return Service1.getId("abc").then(function(response){
    // In above line. Instead of manually passing `abc` I want to 
    //pass it as variable var1  
    // The desired call should be as below. 
    //But var1 is having null here
  //return Service1.getId(var1).then(function(response){
        $scope.genewtId = response.data[0].Id;
        console.log($scope.genewtId);
        return response.data[0].Id;
    }, function(error){
        console.log(error.statusText);
        throw error;
    });
};

第二个函数返回一个promise并接受一个参数:

$scope.getDetails = function(id) {
    var genewtID = id || $scope.genewtId;
    return Service2.getDetails(genewtId).then(function(response){
        $scope.data1 = response.data;
        console.log($scope.data1.toString());
        return response.data;
    }, function(error){
        console.log(error.statusText);
        throw error;
    });
};

然后chaining这两个承诺:

var promise = $scope.getId();

var promise2 = promise.then(function(id) {
                   return $scope.getDetails(id);
               });

var promise2.then(function(data) {
     console.log(data);
}).catch(function(error) {
     console.log(error);
});

问题: 我面临的问题与var1中的$scope.processData()有关 var1null中始终具有$scope.getID的值 var1的值为undefined

2 个答案:

答案 0 :(得分:0)

像这样的声音可能是关闭问题。函数可以访问在定义处而不是在调用处的代码包含的闭包。

var1是真正的null,还是实际上是undefined?如果是undefined,则可能需要做的是使getId将var1作为 argument 而不是依靠从包含的闭包中提取引用(由于上述原因,该引用不起作用) )。如果它确实是null,那么问题可能出在计算var1的代码中,您已经省略了。

编辑:getID()函数看起来非常相似,但是它会像这样开始:

$scope.getID = function(var1) {

代替此:

$scope.getID = function(var1) {

要调用它,您可能会执行以下操作:

var var1 = somethingToGetTheValueOfVar1();
$scope.getID(var1);

答案 1 :(得分:0)

  

我面临的问题与var1中的$scope.processData()有关var1始终在null值的$scope.getID内具有var1值是undefined

var1添加为函数定义的参数:

̶$̶s̶c̶o̶p̶e̶.̶g̶e̶t̶I̶D̶ ̶=̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶(̶)̶ ̶{̶
$scope.getID = function(var1) {
    //return Service1.getId("abc").then(function(response){
    // In above line. Instead of manually passing `abc` I want to 
    //pass it as variable var1  
    // The desired call should be as below. 
    //But var1 is having null here
    return Service1.getId(var1).then(function(response){
        $scope.genewtId = response.data[0].Id;
        console.log($scope.genewtId);
        return response.data[0].Id;
    }, function(error){
        console.log(error.statusText);
        throw error;
    });
};

  

我正在尝试按以下方式调用该函数,但是它不起作用

$scope.processData() = function() { ... $scope.getID(var1); }

assignment statement的左侧必须是变量或属性访问器。

$̶s̶c̶o̶p̶e̶.̶p̶r̶o̶c̶e̶s̶s̶D̶a̶t̶a̶(̶)̶ ̶=̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶(̶)̶ ̶{̶ ̶
$scope.processData = function(data) { 
    //... 
    var var1 //= something
    return $scope.getID(var1); 
}

然后确保正确链接:

$scope.getAllDetails= function () {
    return $http({
        method: "GET",
        url: "api/endpoint"
    }).then(function mySuccess(response) {
        var data = response.data;
        return $scope.processData(data);
    }, function myError(response) {
        console.log(response.statusText);
        //IMPORTANT RE-THROW error
        throw response;
    });
};

return的值分配到.then块很重要。否则,新的承诺将解析为undefined

同样重要的是,.catch个块中的throw。否则,新的承诺将从拒绝的承诺转换为已实现的承诺

有关更多信息,请参见