Javascript 动态地履行承诺。all()
我想弄明白为什么这段代码不起作用。我在一个依赖关系树(deepObject)中循环,对于每一个依赖关系树,我都希望运行一个返回承诺的函数。然后,我希望下一组函数在解析所有承诺之后发生,但是控制台日志在承诺内。所有函数都没有执行。ES6也很酷,如果你有更好的方法,但是我也很想知道为什么这段代码不起作用 更新为添加Javascript 动态地履行承诺。all(),javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我想弄明白为什么这段代码不起作用。我在一个依赖关系树(deepObject)中循环,对于每一个依赖关系树,我都希望运行一个返回承诺的函数。然后,我希望下一组函数在解析所有承诺之后发生,但是控制台日志在承诺内。所有函数都没有执行。ES6也很酷,如果你有更好的方法,但是我也很想知道为什么这段代码不起作用 更新为添加.catch(此操作无效) for(设i=0;i{ console.log('dep promises resolved'); log(`resolved:${JSON.stringify
.catch
(此操作无效)
for(设i=0;i{
console.log('dep promises resolved');
log(`resolved:${JSON.stringify(resolved)}`);
}).catch(err=>console.error(新错误(err));
//promise函数是递归的
承诺功能(obj){
返回新承诺((解决、拒绝)=>{
const keys=Object.keys(deepObj);
for(设j=0;j{
返回另一个函数();
}).然后(()=>{
回报你的承诺([
允诺人1(),
承诺人2(),
承诺人3(),
])。然后(已解决=>{
如果(已解析[0]。属性需要){
决心(正确);
}
决议(假);
});
}).catch(错误=>{
控制台错误(新错误(err));
过程。退出(1);
});
}
}
});
我知道这段对话--
在上面的第二个链接中,公认的答案表明:
在异步填充数组的情况下,您应该获得该数组的承诺,并使用.then(promise.all.bind(promise))。如果您不知道何时停止添加承诺,这无论如何都是不可能的,因为它们可能永远都无法解决
但是我没有使用异步来填充数组。我需要这个吗?我缺少什么
更新
由于我现在在.then()
和.catch()
中都有错误日志记录,所以似乎有什么地方出了问题,与内部发生的事情无关
在promiseFunction(deepObj[keys[j]]之前添加return语句破坏了递归。我从迭代173个对象到68个对象。添加捕获记录没有其他结果。上面的代码被更新以共享更多的递归fn。当我运行它时,它似乎执行了所有承诺,但我无法知道。我最关心的是知道1。promise.all的promise数组包含2.抓住递归对象中所有对象的所有承诺都得到解决的时刻
另外,作为记录,这些返回承诺的函数中的每一个都必须是异步的。为了简化和删除任何不必要的承诺,我已经重复了多次。任务很复杂。必须执行一系列步骤,它们是异步的,并且它们是链接的,因为它们必须重新执行按特定顺序解决
如果Object.keys(obj[keys[j]]).length
为true
则您永远不会调用resolve
或reject
,因此承诺永远不会解决
(请注意,递归调用promiseFunction
会创建一个新的承诺,该承诺永远不会放入promise.all
)
既然你的一些承诺无法解决问题,Promise.all
也无法解决问题
你可能需要更多的东西,包括:
var promises = [];
processObject(obj);
Promise.all(promises).then(etc etc);
function processObject(object) {
for ( loop; over; object ) {
if (condition) {
processObject(object[something]);
} else {
promises.push(new Promise( (res, rej) => {
// so something async
});
}
}
}
让我们看看您的
承诺功能
for (let j = 0; j < keys.length; j++) {
if (Object.keys(obj[keys[j]]).length) {
//if you get in here, promiseFunction returns undefined, and it never gets resolved
promiseFunction(obj[keys[j]]);
} else {
const dep = new Package(keys[j]);
console.log(`skan dep: ${keys[j]}`);
// and some more async hell that all resolves correctly
//but even if it resolves correctly, you still have the if...
}
}
现在,当您进入if语句时,您基本上是根据第二个promiseFunction
是否正确地解决了问题来告诉要解决的承诺-您正在将解决方案委托给另一个承诺
我从来没有听说有人给它起过这个名字,但你可以把它看作是承诺递归:)试着将拒绝函数记录到控制台日志中,看看是否有什么东西失败了“为了简洁起见省略了promiseFunction”-不要这样做。你不需要提供真实的东西,但你需要提供一个。我已经猜到了哪些代码可能会出现在缺少的地方,我无法重现问题:尝试
promisesArray.then(…).catch(err=>console.error('Failed',err))
。在promiseFunction
中,if语句的第一块应返回第二块promiseFunction
的结果-否则它将不会解决任何问题!避免!我已尝试在最新更新中处理所有注释。添加return语句似乎会破坏它。我已尝试处理所有注释在最新的更新中。递归确实包含resolve/reject语句,但不是正确的语句。我建议您回到我说过的部分:(注意,递归调用promiseFunction会创建一个新的承诺,而这个承诺永远不会变成承诺。所有)。您为什么要使用new promise
开始?@Kraken-“promiseFunction返回一个承诺”-它创建承诺a。如果你点击If
语句,它就会递归调用自己。这会创建承诺B。如果点击else
则承诺B被解析。承诺a不会被解析。
var promises = [];
processObject(obj);
Promise.all(promises).then(etc etc);
function processObject(object) {
for ( loop; over; object ) {
if (condition) {
processObject(object[something]);
} else {
promises.push(new Promise( (res, rej) => {
// so something async
});
}
}
}
for (let j = 0; j < keys.length; j++) {
if (Object.keys(obj[keys[j]]).length) {
//if you get in here, promiseFunction returns undefined, and it never gets resolved
promiseFunction(obj[keys[j]]);
} else {
const dep = new Package(keys[j]);
console.log(`skan dep: ${keys[j]}`);
// and some more async hell that all resolves correctly
//but even if it resolves correctly, you still have the if...
}
}
for (let j = 0; j < keys.length; j++) {
if (Object.keys(obj[keys[j]]).length) {
//if you get in here, you're saying this promise will depend on how this second promiseFunction will resolve
return promiseFunction(obj[keys[j]]);
} else {
//omitted for brevity...
resolve('your value');
}
}