N次如何调用异步服务

时间:2018-06-22 21:00:12

标签: angularjs

ForEach中的承诺

我遇到了问题,我需要调用N次服务,而我已经尝试过:

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

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)

1 个答案:

答案 0 :(得分:2)

没有必要为此重新包装新的承诺。只需返回$q.all()承诺:

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

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

    return $q.all(promises);
};

返回的promise的解析值将是结果数组。

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

如果_aCodigoOfertas是一个数组,则可以进一步简单地getProductOfferingPrice

VentafijaAccessService.getProductOfferingPriceAllPromise = function(_aCodigoOfertas) {
    return $q.all(_aCodigoOfertas.map(function(codigo) {
        return get222(codigo);
    }));
};

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

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