Angularjs 如何调用异步服务N次 许诺
我遇到了一个问题,我需要呼叫服务N次,我尝试了以下方法: 这是我调用服务的函数,我发送一个“code”参数并返回一个承诺Angularjs 如何调用异步服务N次 许诺,angularjs,Angularjs,我遇到了一个问题,我需要呼叫服务N次,我尝试了以下方法: 这是我调用服务的函数,我发送一个“code”参数并返回一个承诺 var get222 = function(codigo) { var defer = $q.defer(); var cbOk = function(response) { //console.log(response); defer.resolve(response); }
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()
。这是旧的实现。看看我如何改变我的答案,让你更容易正确地回答。