并发链接 javascript 承诺
Concurrent chained javascript promises
我有 javascript 承诺 A 和 C,其中 B 是 return 承诺的函数。这就是我希望它们流动的方式:
A--->B--->
C-------->
D------>
B 利用 A 的输出,D 利用 B 和 C 的输出
我当前的代码大致如下:
var runPromises = [];
runPromises.push(A.then(B));
runPromises.push(C);
Promise.all(runPromises).then(values => console.log(values));
我看到的是 A 和 C 执行,但 B 直到 A 和 C 注销后才执行。这里执行的正确模式是什么?是否需要将 A 和 B 放在一个包容性承诺中?
To add on to my original question to explain Jaromanda's correct answer: My B function was defined roughly as so:
var B = function(inputA){
return new Promise(function(resolve, reject){
http.get(site, function(done){
inputA['site'] = done;
}
resolve(inputA);
这是在 http.get 可以 return 和丰富 inputA 之前解析 inputA。
要链接承诺,您可以使用 .then()
,但参数必须是 函数,returns 下一个承诺。正确的代码是:
var runPromises = [];
runPromises.push(A.then(() => B));
runPromises.push(C);
Promise.all(runPromises).then(values => console.log(values));
如果 A、B 和 C 是承诺,那么 A.then(B)
将 return A 作为结果。 .then
的参数必须是 FUNCTION,而不是 promise
你想做的是
Promise.all([A.then(result=>B), C]).then(values => console.log(values));
If B is a FUNCTION (as per the comment below) rather than a PROMISE (as per the question), it's a simple change:
Promise.all([A.then(result=>B()), C]).then(values => console.log(values));
//---------------------------^^
或更简单地说
Promise.all([A.then(B), C]).then(values => console.log(values));
这基本上就是您提出的问题 - 所以我现在对问题出在哪里感到困惑?是console.log中显示的值吗?
var delay = (timeout, value) => new Promise(resolve => {
setTimeout(() => {resolve(value); console.log('done', value);}, timeout);
console.log('begin', value)
});
var A = delay(3000, 'valueOfA'); // A is a Promise
var C = delay(2000, 'valueOfC'); // C is a Promise
var B = valA => {
console.log('B called with', valA);
return delay(1000, valA + ':valueOfB'); // include valA to show that the resolved value of B depends on the resolved value of A
} // B is a function that returns a Promise and uses the resolved value of A as input
Promise.all([A.then(B),C]).then(values => console.log(values));
如其他答案所述,如果我们假设 "B" 是一个设置承诺的函数,而不是承诺本身,那么 "B" 应该在不依赖 "C"。您可以通过一个小测试来证明这一点:
let start = Date.now();
function debug(p) {
p.then((r) => {
let secs = ((Date.now() - start) / 1000).toFixed(2)
console.log(secs + "s: " + r);
});
}
let a = new Promise((r) => {
setTimeout(r, 0, "a done");
});
debug(a);
let b = a.then((res) => {
return new Promise((r) => {
setTimeout(r, 0, res + ":b done");
});
});
debug(b);
let c = new Promise((r) => {
setTimeout(r, 1000, "c done");
});
debug(c);
Promise.all([b, c]).then((res) => {
console.log("result: " + JSON.stringify(res));
});
结果:
0.00s: a done
0.01s: a done:b done
1.00s: c done
result: ["a done:b done","c done"]
我有 javascript 承诺 A 和 C,其中 B 是 return 承诺的函数。这就是我希望它们流动的方式:
A--->B--->
C-------->
D------>
B 利用 A 的输出,D 利用 B 和 C 的输出
我当前的代码大致如下:
var runPromises = [];
runPromises.push(A.then(B));
runPromises.push(C);
Promise.all(runPromises).then(values => console.log(values));
我看到的是 A 和 C 执行,但 B 直到 A 和 C 注销后才执行。这里执行的正确模式是什么?是否需要将 A 和 B 放在一个包容性承诺中?
To add on to my original question to explain Jaromanda's correct answer: My B function was defined roughly as so:
var B = function(inputA){
return new Promise(function(resolve, reject){
http.get(site, function(done){
inputA['site'] = done;
}
resolve(inputA);
这是在 http.get 可以 return 和丰富 inputA 之前解析 inputA。
要链接承诺,您可以使用 .then()
,但参数必须是 函数,returns 下一个承诺。正确的代码是:
var runPromises = [];
runPromises.push(A.then(() => B));
runPromises.push(C);
Promise.all(runPromises).then(values => console.log(values));
如果 A、B 和 C 是承诺,那么 A.then(B)
将 return A 作为结果。 .then
的参数必须是 FUNCTION,而不是 promise
你想做的是
Promise.all([A.then(result=>B), C]).then(values => console.log(values));
If B is a FUNCTION (as per the comment below) rather than a PROMISE (as per the question), it's a simple change:
Promise.all([A.then(result=>B()), C]).then(values => console.log(values));
//---------------------------^^
或更简单地说
Promise.all([A.then(B), C]).then(values => console.log(values));
这基本上就是您提出的问题 - 所以我现在对问题出在哪里感到困惑?是console.log中显示的值吗?
var delay = (timeout, value) => new Promise(resolve => {
setTimeout(() => {resolve(value); console.log('done', value);}, timeout);
console.log('begin', value)
});
var A = delay(3000, 'valueOfA'); // A is a Promise
var C = delay(2000, 'valueOfC'); // C is a Promise
var B = valA => {
console.log('B called with', valA);
return delay(1000, valA + ':valueOfB'); // include valA to show that the resolved value of B depends on the resolved value of A
} // B is a function that returns a Promise and uses the resolved value of A as input
Promise.all([A.then(B),C]).then(values => console.log(values));
如其他答案所述,如果我们假设 "B" 是一个设置承诺的函数,而不是承诺本身,那么 "B" 应该在不依赖 "C"。您可以通过一个小测试来证明这一点:
let start = Date.now();
function debug(p) {
p.then((r) => {
let secs = ((Date.now() - start) / 1000).toFixed(2)
console.log(secs + "s: " + r);
});
}
let a = new Promise((r) => {
setTimeout(r, 0, "a done");
});
debug(a);
let b = a.then((res) => {
return new Promise((r) => {
setTimeout(r, 0, res + ":b done");
});
});
debug(b);
let c = new Promise((r) => {
setTimeout(r, 1000, "c done");
});
debug(c);
Promise.all([b, c]).then((res) => {
console.log("result: " + JSON.stringify(res));
});
结果:
0.00s: a done
0.01s: a done:b done
1.00s: c done
result: ["a done:b done","c done"]