我有一组API,我必须在for循环中运行
for(var i=0; i<array.length; i++ )
service.getfunction(array[i]).then(function(response) {
service.getfunction1(response).then(function(response) {
service.getfunction2(response).then(function(response) {
service.getfunction3(response).then(function(response) {
console.log(response);
});
});
});
});
)
第二个循环应该在我从第一个循环的最后一个getfunction3 API获得结果后才开始。我怎么能这样做?
答案 0 :(得分:2)
首先 - 你可以将你的承诺链接起来:
function doJob(i) {
return service.getfunction(array[i]).then(function(response) {
return service.getfunction1(response);
}).then(function(response) {
return service.getfunction2(response);
}).then(function(response) {
return service.getfunction3(response);
}).then(function(response) {
console.log(response);
});
}
此函数将返回在完成所有此服务调用后将解决的承诺。 现在让我们使用它:
var p = Promise.resolve(true);
for(var i = 0; i < array.length; i++) {
(function(idx) { //We need to wrap it or we will pass incorrect i into doJob
p = p.then(function() {
return doJob(idx);
});
})(i);
}
p.then(function() {
console.log('Everything done');
});
答案 1 :(得分:0)
将其包裹在一个函数中:
// Declare function
function LoopAPI() {
for(var i=0; i<array.length; i++ )
service.getfunction(array[i]).then(function(response) {
service.getfunction1(response).then(function(response) {
service.getfunction2(response).then(function(response) {
service.getfunction3(response).then(function(response) {
console.log(response);
// Call function again
LoopAPI();
});
});
});
});
)
}
// First call
LoopAPI();
答案 2 :(得分:0)
你可以链接promises然后使用Array.reduce按顺序调用它们:
array.reduce(function(previous, next)
{
return previous.then(function()
{
return service.getfunction(next);
})
.then(function(response)
{
return service.getfunction1(response);
})
.then(function(response)
{
return service.getfunction2(response);
})
.then(function(response)
{
return service.getfunction3(response);
});
}, Promise.resolve())
.then(function()
{
console.log("All done.");
})
.catch(function(error)
{
console.log(error);
});