并发链接的javascript承诺

时间:2016-11-23 22:21:00

标签: javascript concurrency promise es6-promise

我有javascript承诺A和C,其中B是一个返回promise的函数。这就是我希望他们流动的方式:

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需要被包含在一个包含的承诺中吗?

  

再加上我原来的问题来解释Jaromanda的正确答案:我的B函数大致定义如下:

var B = function(inputA){
    return new Promise(function(resolve, reject){
        http.get(site, function(done){
            inputA['site'] = done;
        }
    resolve(inputA);

这是在http.get返回之前解析inputA并丰富inputA。

3 个答案:

答案 0 :(得分:2)

如果A,B和C是承诺,则A.then(B)将返回A作为结果。 .then的参数必须是FUNCTION,而不是promise

你想做的事情就像是

Promise.all([A.then(result=>B), C]).then(values => console.log(values));
  

如果B是一个功能(根据下面的评论)而不是PROMISE(根据问题),这是一个简单的改变:

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));

答案 1 :(得分:1)

要链接承诺,您可以使用.then(),但参数必须是函数才能返回下一个Promise。正确的代码是:

innodb_lock_wait_timeout

答案 2 :(得分:1)

正如其他答案所提到的,如果我们假设“B”是一个设置承诺而不是承诺本身的函数,那么你应该在不依赖“C”的情况下执行“B”是正确的。您可以通过一个小测试证明这一点:

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"]