Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺_Javascript_Node.js_Workflow_Promise_Q - Fatal编程技术网

Javascript 在node中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺

Javascript 在node中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺,javascript,node.js,workflow,promise,q,Javascript,Node.js,Workflow,Promise,Q,在我的环境中,我使用node+q(我不是这方面的专家),所以主要的论点是:承诺 我有一个函数,需要并行执行两个操作,一个很长,一个很短 var parallelWrapper=函数(输入){ var deferred=Q.deferred(); var fastPromise=fastcompulation() .then(功能(数据){ 延迟解析(数据) }, 功能(err){ 延迟。拒绝(错误) }); //当然,下面这一个不会正常工作 var slowPromise=slowComput

在我的环境中,我使用node+q(我不是这方面的专家),所以主要的论点是:承诺

我有一个函数,需要并行执行两个操作,一个很长,一个很短

var parallelWrapper=函数(输入){
var deferred=Q.deferred();
var fastPromise=fastcompulation()
.then(功能(数据){
延迟解析(数据)
},
功能(err){
延迟。拒绝(错误)
});
//当然,下面这一个不会正常工作
var slowPromise=slowComputation()
.then(功能(数据){
做某事;
})
.then(功能(数据){
makeSomethingElse();
})
.失败(功能(错误){
控制台日志(err);
});
Q.all([快速承诺,慢速承诺]);
兑现诺言;
}
我会这么做:

var parallelWrapper = function(input) {

  var fastPromise = fastComputation();

  var slowPromise = slowComputation()
    .then(function(data) {
      return makeSomething();
    })
    .then(function(data) {
      return makeSomethingElse();
    }).catch(console.error);

  return Q([fastPromise, slowPromise]).all();
}
第二个例子是这样的:

var myLongChainOfFunctions = function() {

  return firstFunction(someParams)
    .then(secondFunction)
    .then(thirdFunction)
    /*...*/
    .then(parallelWrapper)
    /*...*/
    .then(lastFunction)
    .catch(doSomethingWithError)

}
好的,你可以这样做:

var parallelWrapper = function(input) { 
      slowComputation()
        .then(function(data) {
          return makeSomething();
        })
        .then(function(data) {
          return makeSomethingElse();
        }).catch(console.error);

      return fastComputation();
    }

你的
Q.all();你可以直接使用这个承诺。听起来你想返回两个单独的承诺。好吧,也许我应该在一开始就澄清一下:这只是一个例子,不应该运行或其他什么。我的问题是:我们是否可以并行运行两个函数,但只等待其中一个函数,然后再继续,而另一个函数则异步完成其任务,因为它无论如何都不会影响工作流?为什么不这样做?异步函数不会因为没有观察到其结果而神奇地停止。但是,您需要决定如何处理错误。是的,但这种方式无法实现并行包装,并且在快速和慢速计算准备就绪之前,链不会继续运行,对吗?我希望它能在FastComputing准备好进行编辑后继续,但它似乎没有按照我希望的方式工作:我编辑了问题的代码,主要问题是parallelWrapper后面链接的'then'函数没有任何输入参数,但未定义,虽然我希望它能有FastComputing的结果作为输入参数,但在input Parameter中,您将从FastComputing()返回数据。如果您没有定义FastComputing()中有问题,我可以看到这个函数体?好的,那么您的解决方案已经实现,并在步骤4中生成以下输出:4。应该有快速计算结果:未定义您必须返回数据在63行中的parallelWrapper承诺。