我的问题是我不知道如何知道动态Promise数组何时解决了所有Promise。
这里有一个例子:
var promiseArray = [];
promiseArray.push(new Promise(){/*blablabla*/});
promiseArray.push(new Promise(){/*blablabla*/});
Promise.all(promiseArray).then(function(){
// This will be executen when those 2 promises are solved.
});
promiseArray.push(new Promise(){/*blablabla*/});
我这里有问题。该Promise.all
行为将在解决前两个Promise时执行,但是,在解决这两个Promise之前,添加了第三个Promise,并且不会考虑新的Promise。
所以,我需要的是这样说:“嘿Promise.all
,你有一个动态数组要检查”。我该怎么做?
请记住,这只是一个示例。我知道我可以将行Promise.all
移到最后一行,但实际上新的 Promise 是在解决另一个 Promise 时动态添加的,并且新的 Promise 也可以添加新的 Promise,因此,它是一个真正的动态数组。
我真正的用例是这样的:
- 我使用 Twitter API 检查是否有新推文(使用 Search Api)。
- 如果我发现了新的推文,我会将它添加到 MongoDB(这里我们有 Promises)。
- 如果这些新推文与我的 MongoDB 中没有的用户相关(这里我们有新的Promise,因为我必须去 MongoDB 来检查我是否有那个用户),我们去 Twitter API 获取用户信息(更多Promise),我们将这些新用户添加到 MongoDB(是的,更多Promise)。
- 然后,我去 MongoDB 插入新值以将新推文与这些新用户相关联(更多Promise!wiii!)。
- 当对 MongoDB 的所有查询都得到解决(所有选择、更新、插入)后,关闭 MongoDB 连接。
另一个困难的例子:
var allPromises = [];
allPromises.push(new Promise(function(done, fail){
mongoDB.connect(function(error){
//Because mongoDB works with callbacks instead of promises
if(error)
fail();
else
ajax.get('/whatever').then(function(){
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla bla
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla bla
}));
} else {
ajax.get('/whatever/2').then(function(){
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla bla
}));
}
});
}
}));
} else {
ajax.get('/whatever/2').then(function(){
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla bla
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla bla
}));
} else {
ajax.get('/whatever/2').then(function(){
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla bla
}));
}
});
}
}));
}
});
}
});
});
}));
Promise.all(allPromises).then(function(){
// Soooo, all work is done!
mongodb.close()!
});
所以,现在,一个美丽的例子。我们需要showAllTheInformation
在最后一个(我们不知道哪个是最后一个)promise 被调用时调用该函数。你怎么做呢?:
var name = 'anonimus';
var date = 'we do not know';
function userClikOnLogIn() {
$http.get('/login/user/password').then(function(data){
if (data.logguedOk) {
$http.get('/checkIfIsAdmin').then(function(data){
if (data.yesHeIsAnAdmin) {
$http.get('/getTheNameOfTheUser').then(function(data){
if(data.userHasName) {
$http.get('/getCurrentDate').then(function(data){
currentDate = data.theNewCurrentDate;
});
}
});
}
});
}
});
}
function showAllTheInformation() {
alert('Hi ' + name + ' today is:' + date);
}
这是另一个具有更多上下文的示例:https : //jsfiddle.net/f0a1s79o/2/