Как убедиться, что переменная не равна нулю при использовании подхода цепочки обещаний? - PullRequest
0 голосов
/ 11 мая 2019

Я использую 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;
    });
};

Вторая функция возвращает обещание и принимает аргумент:

$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;
    });
};

Затем связывание двух обещаний:

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() var1 всегда имеет значение null в пределах $scope.getID значение var1 равно undefined

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Проблема, с которой я сталкиваюсь, связана с 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); }

В левой части оператора присваивания должна быть переменная или метод доступа к свойству.

$̶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;
    });
};

Важно вернуть значения в .then блоков. В противном случае новое обещание будет иметь вид undefined.

.

Также важно бросить из .catch блоков. В противном случае новое обещание будет преобразовано из отклоненного обещания в выполненное обещание.

Для получения дополнительной информации см.

0 голосов
/ 11 мая 2019

Похоже, это может быть проблемой с замыканиями.Функция будет иметь доступ к содержащим замыканиям кода там, где она была определена , а не там, где она называется .

Действительно ли var1 null илиэто на самом деле undefined?Если это undefined, вероятно, вам нужно сделать так, чтобы getId принял var1 в качестве аргумента вместо того, чтобы полагаться на извлечение ссылки из содержащего замыкания (что не будет работать по причине, указанной выше).Если это действительно null, то проблема, вероятно, заключается в коде, который вычисляет var1, который вы пропустили.

РЕДАКТИРОВАТЬ: функция getID() будет выглядеть очень похоже, но она будет выглядеть так:

$scope.getID = function(var1) {

Вместо этого:

$scope.getID = function(var1) {

И для его вызова вы, вероятно, сделаете что-то вроде этого:

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