Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何调用异步服务N次 许诺_Angularjs - Fatal编程技术网

Angularjs 如何调用异步服务N次 许诺

Angularjs 如何调用异步服务N次 许诺,angularjs,Angularjs,我遇到了一个问题,我需要呼叫服务N次,我尝试了以下方法: 这是我调用服务的函数,我发送一个“code”参数并返回一个承诺 var get222 = function(codigo) { var defer = $q.defer(); var cbOk = function(response) { //console.log(response); defer.resolve(response); }

我遇到了一个问题,我需要呼叫服务N次,我尝试了以下方法:

这是我调用服务的函数,我发送一个“code”参数并返回一个承诺

var get222 = function(codigo) {
        var defer = $q.defer();
        var cbOk = function(response) {
            //console.log(response);
            defer.resolve(response);
        }

        var cbError = function(error) {
            //console.log(error);
            defer.reject(error);
        }

        VentafijaAccessService.getProductOfferingPrice(codigo, cbOk, cbError);
        return defer.promise;
}
在这个函数之后,我得到了代码,我需要打N次电话,当他们完成返回承诺时,我会得到我发送的每个代码的答案

var getProductOfferingPrice = function(_aCodigoOfertas) {
        var deferred = $q.defer();
        var results = [];

        var promises = [];

        angular.forEach(_aCodigoOfertas, function(codigo) {
            promises.push(get222(codigo));
        });

        $q.all(promises)
            .then(function(results) {
                // here you should have all your Individual Object list in `results`
                deferred.resolve({
                    objects: results
                });
            });

        return deferred.promise;

    };
如果执行了对服务的调用,但从未返回承诺,我无法得到每个服务的响应

编辑

VentaDataService.js

var get222 = function(codigo) {
    return $q(function(resolve, reject) {
        VentafijaAccessService.getProductOfferingPrice(codigo, resolve, reject);
    });
}

var getProductOfferingPrice = function(_aCodigoOfertas) {
    return $q.all(_aCodigoOfertas.map(function(codigo) {
        return get222(codigo);
    }));
};
VentaFijaController.js

var cbOk2 = function(response) {
    console.log(response);
}

var cbError2 = function(error) {
    console.log(error);
}

VentafijaDataService.getProductOfferingPrice(codigoOfertas)
    .then(cbOk2, cbError2)

没有必要在这件事上做出新的承诺。只需返回
$q.all()
承诺:

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    var promises = [];

    angular.forEach(_aCodigoOfertas, function(codigo) {
        promises.push(get222(codigo));
    });

    return $q.all(promises);
};
返回承诺的解析值将是一个结果数组

VentafijaAccessService.getProductOfferingPriceAllPromise(...).then(results => {
    console.log(results);
}).catch(err => {
    console.log(err);
});

如果
\u aCodigoOfertas
是一个数组,您可以进一步简单地
getProductOfferingPrice

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    return $q.all(_aCodigoOfertas.map(function(codigo) {
        return get222(codigo);
    }));
};
var get222 = function(codigo) {
    return $q(function(resolve, reject)) {
        // call original (non-promise) implementation
        VentafijaAccessService.getProductOfferingPrice(codigo, resolve, reject);
    });
}

您还可以将
get222()
大大简化为:

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    return $q.all(_aCodigoOfertas.map(function(codigo) {
        return get222(codigo);
    }));
};
var get222 = function(codigo) {
    return $q(function(resolve, reject)) {
        // call original (non-promise) implementation
        VentafijaAccessService.getProductOfferingPrice(codigo, resolve, reject);
    });
}

然后,在控制器中,您可以执行以下操作:

VentafijaDataService.getProductOfferingPriceAllPromise(codigoOfertas).then(function(result) {
     console.log(result);
}).catch(function(e) {
     console.log('Error: ', e);
});

没有必要在这件事上做出新的承诺。只需返回
$q.all()
承诺:

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    var promises = [];

    angular.forEach(_aCodigoOfertas, function(codigo) {
        promises.push(get222(codigo));
    });

    return $q.all(promises);
};
返回承诺的解析值将是一个结果数组

VentafijaAccessService.getProductOfferingPriceAllPromise(...).then(results => {
    console.log(results);
}).catch(err => {
    console.log(err);
});

如果
\u aCodigoOfertas
是一个数组,您可以进一步简单地
getProductOfferingPrice

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    return $q.all(_aCodigoOfertas.map(function(codigo) {
        return get222(codigo);
    }));
};
var get222 = function(codigo) {
    return $q(function(resolve, reject)) {
        // call original (non-promise) implementation
        VentafijaAccessService.getProductOfferingPrice(codigo, resolve, reject);
    });
}

您还可以将
get222()
大大简化为:

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    return $q.all(_aCodigoOfertas.map(function(codigo) {
        return get222(codigo);
    }));
};
var get222 = function(codigo) {
    return $q(function(resolve, reject)) {
        // call original (non-promise) implementation
        VentafijaAccessService.getProductOfferingPrice(codigo, resolve, reject);
    });
}

然后,在控制器中,您可以执行以下操作:

VentafijaDataService.getProductOfferingPriceAllPromise(codigoOfertas).then(function(result) {
     console.log(result);
}).catch(function(e) {
     console.log('Error: ', e);
});

出于某种奇怪的原因,我在“网络”选项卡中看到了执行情况,但从未输入then或catch调用:/@sioesi-您必须在问题的末尾添加您正在使用的存在该问题的代码。如果看不到您正在运行的代码,我无法进行调试。@sioesi-在控制器中,您必须将
VentafijaDataService.getProductOfferingPrice(codigofertas)
更改为新函数
getProductOfferingPrice(codigofertas)。然后(…).catch(…)
。您正在调用函数的旧版本,而不是新版本。函数getProductOfferingPrice inVentaFijaDataService@sioesi-代码定义的函数
getProductOfferingPrice()
只是一个普通函数。它不是
VentafijaDataService.getProductOfferingPrice()
。这是旧的实现。看看我是如何改变我的答案,让你更容易正确地回答。出于某种奇怪的原因,我在“网络”选项卡中看到了执行情况,但从未输入then或catch调用:/@sioesi-你必须在问题的末尾添加你正在使用的有该问题的代码。如果看不到您正在运行的代码,我无法进行调试。@sioesi-在控制器中,您必须将
VentafijaDataService.getProductOfferingPrice(codigofertas)
更改为新函数
getProductOfferingPrice(codigofertas)。然后(…).catch(…)
。您正在调用函数的旧版本,而不是新版本。函数getProductOfferingPrice inVentaFijaDataService@sioesi-代码定义的函数
getProductOfferingPrice()
只是一个普通函数。它不是
VentafijaDataService.getProductOfferingPrice()
。这是旧的实现。看看我如何改变我的答案,让你更容易正确地回答。