2016-05-27 54 views
0

我有多個promise'我想要一個接一個地運行,而且我不確定我想要返回承諾,因爲它變得非常混亂!Node.js異步並行不能如何工作?

所以我決定使用async庫並實現parallel方法。現在我注意到,我所有的承諾都沒有運行一個,而是他們正在做的承諾是假設todo(每次運行+完成)。

我注意到所有的console.log都在所有的promise完成之前就運行了。

async.parallel([ 
     (cb) => { 
      console.log ("hi") 
      grabMeData (Args) 
       .then ((data) => { 

       // The promise is done and now I want to goto the next functio 
       cb(); 
       }).catch(()=>console.log('err')); 
     }, 
     (callback) => { 
      // The above promise is done, and I'm the callback 
      Query.checkUserExists() 
      .then (() => { 
      if (Query.error) { 
       console.log (Query.error); // Determine error here 
       return; // Return to client if needed 
      } 
      callback(); 
      }); 
     }, 
     () => { 
      // The above promise is done and I'm the callback! 

      // Originally wanted to be async 
      if (Query.accAlreadyCreated) { 
      this.NewUserModel.user_id = Query.user_id; 
      this.generateToken(); 
      } else { 
      console.log ("account not created"); 
      } 
      console.log ('xx') 
     } 
    ],() =>{ 
     console.log ("finished async parallel") 
    }); 

爲什麼我的回調正在運行before任何理由的承諾得到解決(。然後)。

+3

如果你想爲了運行這些功能,那麼async.parallel不是API你需要,你應該嘗試async.waterfall –

+0

啊hhhh好吧@StephenCrosby謝謝 – James111

+2

有了承諾,你不應該使用'async.js'。只需用'then'鏈接它們。 – Bergi

回答

2

像BERGI說,當你使用承諾async.js是多餘的,你的代碼可以爲被簡化:

console.log('hi') 
grabMeData(Args) 
    .catch(e => console.error(e)) 
    .then(() => Query.checkUserExists()) 
    .then(() => { 
    if (Query.accAlreadyCreated) { 
     this.NewUserModel.user_id = Query.user_id 
     return this.generateToken() 
    } 
    console.log ("account not created") 
    }) 
    .then(() => console.log ('xx') ) 
+0

你100%正確...不知道我爲什麼想使用async軟件包。 – James111