我需要将数据从数据库推送到一个新数组,这将返回promise对象。 5次我需要打电话。所以我这样做。
var items = [];
function setData() {
facilityAPIs.getAllListItems.get({
listName: "Samples"
}).
$promise.then(function(data) {
alert("1");
for (var j = 0; j < data.items.length; j++) {
items.push(data.items[j]);
}
console.log(items);
}).then(function() {
facilityAPIs.getAllListItems.get({
listName: "Controls"
}).
$promise.then(function(data) {
alert("2");
for (var j = 0; j < data.items.length; j++) {
items.push(data.items[j]);
}
console.log(items);
});
}).then(function() {
facilityAPIs.getAllListItems.get({
listName: "FibroBlast"
}).
$promise.then(function(data) {
alert("3");
for (var j = 0; j < data.items.length; j++) {
items.push(data.items[j]);
}
console.log(items);
});
}).then(function() {
facilityAPIs.getAllListItems.get({
listName: "pBMC"
}).
$promise.then(function(data) {
alert("4");
for (var j = 0; j < data.items.length; j++) {
items.push(data.items[j]);
}
console.log(items);
});
}).then(function() {
facilityAPIs.getAllListItems.get({
listName: "iPS Cell Lines"
}).
$promise.then(function(data) {
alert("5");
for (var j = 0; j < data.items.length; j++) {
items.push(data.items[j]);
}
console.log(items);
});
});
}
但是如果我想在将所有数据推入其中后使用items数组,例如调用splitData(items)。我怎么能这样。谢谢。
答案 0 :(得分:0)
这是这样的吗?
var items = [];
some_fn(...)
.then(function(data) { [push data to items] })
.then(function() {
some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
...use items somehow after _all_ data has been pushed to it...
})
如果是这样,那么问题是这个“.then
链”实际上不是一个链:“顶级.then
”将一个接一个地执行,但是在每个链中都有你单独开始一个新的异步操作。这些中的每一个最终都会将一些数据推送到项目,但最终结果无法在最后一个“.then
”中捕获。
如果您只是将多个“已履行”的回调附加到同一承诺中,并且您没有从他们那里返回承诺,那么只要您完成第一个承诺,它们就会一个接一个地执行:
promise
.then(function() { foo; } // will be executed when promise is fulfilled
.then(function() { bar; } // will be executed right after
如果在回调中运行其他异步操作,并且想要创建一个链,则需要从回调中返回一个promise:
promise
.then(function() { return promise_foo; } // will be executed when promise is fulfilled
.then(function() { return promise_bar; } // will be executed when promise_foo is fulfilled
(有关详情,请参阅spec中的承诺解决程序。)
因此原始示例可以像这样重新组织以创建单个链:
some_fn(...)
.then(function(data) { [push data to items] })
.then(function() {
return some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
return some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
return some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
return some_fn(...).then(function(data) { [push data to items] });
})
.then(function() {
...all operations have finished, you can use items here...
})