nodejs并行运行两个函数

时间:2018-06-06 07:16:42

标签: node.js concurrency

我需要在Node JS中并行运行两个任务,就像我们在Java中生成两个线程一样。我查看了与promise和async / await相关的所有文档。

我经历了以下主题

Parallel function calls in Node.js Parallel operations with Promise.all?

即使我使用promise.all,代码也会按顺序执行。

但我找不到办法。我看到http.get在后台执行,一旦结果可用,就会在回调中返回响应。直到发生这种情况,我还可以完成其他任务。我可以做这样的事情来实现我自己代码中的并行性。

我有以下代码。我想确保func1和fucn2并行运行

我期待按以下顺序输出

calling func1
calling func2
called all functions
promise 1 done!
promise 2 done!

这是我的代码

function func1() {

  let promise = new Promise((resolve, reject) => {
    try {
    for(var q=0;q<10000;q++) {
        console.log(q);
    }
    resolve("promise 1 done!")
    } catch(e) {
    reject(e);
    }
  });
  return promise;
}

function func2() {

  let promise = new Promise((resolve, reject) => {
    try {
    for(var r=0;r<10000;r++) {
        console.log(r);
    }
    resolve("promise 2 done!")
    } catch(e) {
    reject(e);
    }
  });
  return promise;
}


function func() {
    console.log("calling func1");
    var promise1 = func1();

    console.log("calling func2");
    var promise1 = func2();

    console.log("called all functions");
    //do some other task

    promise1
.then(result => { console.log("Promise 1 : "+result); })
.catch(error => { console.log("Promise 1 err : "+error ); });

    promise2
.then(result => { console.log("Promise 2 : "+result); })
.catch(error => { console.log("Promise 2 err : "+error ); });
}

func();

简而言之,我怎样才能使两个for循环并行执行。

是否可以在Node JS中使用。我错过了什么吗?

  • Albie Morken

3 个答案:

答案 0 :(得分:1)

查看async.parallel。你基本上写道:

async.parallel( [

    function ( callback ) {
        // Code
    },

    function ( callback ) {
        // Code
    }

], function ( error, results ) {
    // Both done
} );

答案 1 :(得分:0)

您可以使用Promise.all。例如:

var promise1 = func1();
var promise2 = func2();

Promise.all([promise1, promise2])
  .then(results => console.log(results)); // [promise1Result, promise2Result]

如果您希望承诺一个接一个地解决,您可以这样做:

func1().then(result1 => {
  // do something with the result
  return func2();
})
.then(result2 => {
  // do something with the result
})
.catch(err => console.log(err));

答案 2 :(得分:0)

我知道这是一个老问题,但是没有人指出原始问题的代码有误。

function func() {
    console.log("calling func1");
    var promise1 = func1();      

    console.log("calling func2");
    var promise1 = func2();    // <- Mistake: should be assigned to promise2 not promise1

    console.log("called all functions");
    //do some other task

    promise1
.then(result => { console.log("Promise 1 : "+result); })
.catch(error => { console.log("Promise 1 err : "+error ); });

    promise2
.then(result => { console.log("Promise 2 : "+result); })
.catch(error => { console.log("Promise 2 err : "+error ); });
}