Javascript node.js promise:then()的promise嵌套在then()链中,不';无法解决
编写演示脚本以理解承诺我在then()中嵌套了多个承诺(使用promissions.all()在解决所有承诺后继续)。嵌套承诺的then()未得到解析:Javascript node.js promise:then()的promise嵌套在then()链中,不';无法解决,javascript,node.js,promise,Javascript,Node.js,Promise,编写演示脚本以理解承诺我在then()中嵌套了多个承诺(使用promissions.all()在解决所有承诺后继续)。嵌套承诺的then()未得到解析: var Promise = require("bluebird"); var array = []; // push promises onto array new Promise(function(resolve, reject) { setTimeout(function() { for (var i = 5
var Promise = require("bluebird");
var array = [];
// push promises onto array
new Promise(function(resolve, reject) {
setTimeout(function() {
for (var i = 5 - 1; i >= 0; i--) {
array.push(returnapromise());
console.log("pushed promise number", i, "onto array");
}
resolve();
}, 300);
})
.then(function() {
new Promise.all(array).then(function() {
console.log("\nall done\n");
});
});
// function that returns a promise
var returnapromise = function() {
return new Promise(function(yolo) {
new Promise(function() {
setTimeout(function() {
console.log("async function within nested promise");
}, 200);
})
.then(function() {
setTimeout(function() {
console.log("async function within then one")
}, 100);
})
.then(function() {
setTimeout(function() {
console.log("async function within then two")
yolo();
}, 50);
});
}) // eof returned promise
}; // eof returnapromise()
但是,使用嵌套承诺中的回调可以实现期望的目标,如下所示:
var Promise = require("bluebird");
var array = [];
// push promises onto array
new Promise(function(resolve, reject) {
setTimeout(function() {
for (var i = 5 - 1; i >= 0; i--) {
array.push(returnapromise());
console.log("pushed promise number", i, "onto array");
}
resolve();
}, 300);
})
.then(function() {
new Promise.all(array).then(function() {
console.log("\nall done\n");
});
});
// function that returns a promise
var returnapromise = function() {
return new Promise(function(yolo) {
new Promise(function() {
setTimeout(function() {
console.log("async function within nested promise");
one()
}, 200);
var one = function() {
setTimeout(function() {
console.log("cb one")
two();
}, 100);
};
var two = function() {
setTimeout(function() {
console.log("cb two")
yolo();
}, 50);
};
}) // eof nested promise
}) // eof returned promise
}; // eof returnapromise()
function delay(t, val) {
return new Promise(function(resolve) {
setTimeout(function() {
console.log(val);
resolve(val);
}, t);
});
}
// function that returns a promise
var returnapromise = function() {
return delay(200, "async function within nested promise").then(function() {
return delay(100, "async function within then one");
}).then(function() {
return delay(50, "async function within then two");
});
}; // eof returnapromise()
如何编写嵌套的承诺,然后才能真正解决这些问题?在第一个版本的
returnapromise()
中,您创建了两个承诺,一个嵌套在另一个内
内部承诺永远不会得到解决(没有代码可以解决它)。因此,它从不调用其.then()
处理程序,这意味着永远不会调用yolo()
函数,这意味着永远不会解析外部承诺。所以,它永远被卡住了
您可以通过解析第一个setTimeout()
中的内部承诺来解决这个问题,然后第二个setTimeout()
仍然与整个承诺链断开连接
您可以像这样重写returnapromise()
:
var Promise = require("bluebird");
var array = [];
// push promises onto array
new Promise(function(resolve, reject) {
setTimeout(function() {
for (var i = 5 - 1; i >= 0; i--) {
array.push(returnapromise());
console.log("pushed promise number", i, "onto array");
}
resolve();
}, 300);
})
.then(function() {
new Promise.all(array).then(function() {
console.log("\nall done\n");
});
});
// function that returns a promise
var returnapromise = function() {
return new Promise(function(yolo) {
new Promise(function() {
setTimeout(function() {
console.log("async function within nested promise");
one()
}, 200);
var one = function() {
setTimeout(function() {
console.log("cb one")
two();
}, 100);
};
var two = function() {
setTimeout(function() {
console.log("cb two")
yolo();
}, 50);
};
}) // eof nested promise
}) // eof returned promise
}; // eof returnapromise()
function delay(t, val) {
return new Promise(function(resolve) {
setTimeout(function() {
console.log(val);
resolve(val);
}, t);
});
}
// function that returns a promise
var returnapromise = function() {
return delay(200, "async function within nested promise").then(function() {
return delay(100, "async function within then one");
}).then(function() {
return delay(50, "async function within then two");
});
}; // eof returnapromise()
正在工作的演示:您实际上想在这里做什么?
处理程序中的异步函数。然后()
处理程序本身不会从返回承诺。然后()
处理程序完全与承诺链断开连接,根本不会影响它。这里似乎有很多错误,但我不知道您真正想要实现什么,所以我不确定具体建议是什么。此外,您不执行新承诺。所有(数组),您只需执行返回承诺。所有(数组)
。在返回承诺()的内部,有多个异步操作彼此断开连接,所有操作都并行运行,只有一个实际调用父承诺的resolve函数。这么多事情都错了,不知道实际目标就不知道从哪里开始。@jfriend00这就是我问的原因:)谢谢!当我向最内部的promise添加一个resolve函数,然后调用yolo()
来解析returnapromise()
返回的promise时,所有操作都会执行。不幸的是,promise.all()
在最内在的承诺的then()
s之前得到解决。如何解决此问题?@r0bs-如果将resolve()
放在第一个setTimeout()
内,则第二个setTimeout()
将执行,但第三个不会等待,因为第二个未以任何方式连接到您的承诺链。您不应该在一个.then()
处理程序中运行异步操作,该处理程序不会返回处理程序的承诺,因为这会使这些异步操作与它们周围发生的事情不协调。请注意,在我的代码示例中,每个包含另一个异步操作的.then()
处理程序都会从该异步操作返回一个承诺。@r0bs-我无法对您更改的代码进行注释,也看不见。我已经在我的回答和之前的评论中解释了如何在.then()
处理程序中协调异步操作。刚刚看到您的编辑!-谢谢!那应该对我有用@JaromandaX-是的,但我试图向OP展示如何创建自己的函数来返回承诺,然后在.then()
处理程序中使用它们。