2017-02-07 35 views
0

背景通過回撥功能傳遞數據時,此範圍

我的問題是理解一個範圍,如何恰當地使用回調函數。當我嘗試計劃時,我似乎無法將事件串起來。我在閱讀帖子時遇到了困難,並將它們與我目前的問題聯繫起來我想我真正得不到的是如何實現邏輯。

問題

我有是導致我的問題在我的應用程序的幾個場景。它們都是圍繞着我所需要的數據尚未在範圍內的情況。但是該函數已經有一個回調函數。

該功能用於插入數據到數據庫中。

updateProfile: function (req, res) { 
    pool.getConnection(function (err, connection) { 
     var email = req.body.email; 
     var sql = 'INSERT INTO rw_users SET email = ?'; 
     var params = [email]; 

     connection.query(sql, params, function (err, results, fields) { 
      if (err) { 
       res.status(500).send(); 
       throw err; 
      } 
      connection.release(); 
     }); 
    }); 
}, 

該下一個函數需要剛創建的用戶的ID。

createCustomerProfile: function (email, id) { 
      merchant.createCustomerProfile(email, id, function callback(merchantRes){ 
        pool.getConnection(function (err, connection) { 
       var sql = 'UPDATE rw_user SET auth_customer_id = ? WHERE email = ?'; 
       var params = [merchantRes, email]; 
       connection.query(sql, params, function (err, results, fields) { 
        if (err) { 
         throw err; 
        } 
        console.log('new customer created at authorize.net'); 
       }); 
      }); 
      }); 
     }, 

在功能updateProfile()我創造我的數據庫中的新用戶。在第二個函數​​中,我需要在函數1中輸入的新創建用戶的ID。

請給我一種處理這種功能的方法。我需要第一個過程中的數據,以便在第二個功能中使用它。隨着它的發展,這種情況會變得更糟,因爲當函數2完成後,它將在它的API調用響應中產生一個新的customerID。該響應還需要進行另一個數據庫查詢以使用其ID來更新該行。然後一旦這兩個函數完成,我需要再次查詢數據庫以返回整行。

爲了打破這種下來,

  1. 在數據庫中創建用戶。
  2. 使用功能1.創建新用戶的ID和電子郵件與authorize.net API添加的新客戶賬戶ID獲取函數創建2
  3. 插入新的客戶ID從authorize.net API的響應放入在函數1中創建的新用戶行中。
  4. 返回整行。

我的問題很清楚。什麼是可能的解決方案,以便能夠執行類似於我的列表中的任務,並明確地實施它們以進行處理,以便我可以在範圍內使用來自每個任務的響應?

+0

如果它們是兩個不同的函數,那麼使用回調作爲第三個參數來執行createCustomerProfile –

+1

恐怕你的問題不清楚。是關於JavaScript的問題(如何在異步生成結果時將函數串在一起),還是關於MySQL並在插入後返回信息?另外:請保留無關的細節。你的整個第一段和大約一半的文本是無關緊要的,只會妨礙人們閱讀併爲你提供答案。 –

+0

MySQL的問題(如果這是這是什麼)在這裏回答:http://stackoverflow.com/questions/31371079/retrieve-last-inserted-id-with-mysql一個簡單的搜索「nodejs MySQL獲取最後的ID」轉身它起來。更多關於搜索[這裏](/幫助/搜索)。 –

回答

1

實現您的程序最簡單的方法是使用嵌套的回調,但這很容易變得混亂和難以維護您的代碼。 我們可以使用承諾或生成器以更優雅的方式做到這一點。首先,讓我們看看下面的代碼(簡單的代碼)。

 const test1=() => { 
     return new Promise((resolve,reject)=>{ 
       setTimeout(function(){ <-- async operation 
       resolve(10); 
      }) 
     }) 
    } 

    const test2= (data) => { 
     return new Promise((resolve,reject)=>{ 
        setTimeout(function(){ <-- async operation 
         resolve(data+20) 
        }) 
       }) 
    } 

    test1() 
    .then(test2) 
    .then((finalData)=>{console.log(finalData)}); 

這將使我們的價值30.那麼,這如何工作。 test1和test2都返回具有方法名稱'then'的promise對象。

new Proimse((resolve,reject)=>{ async operation comes here , when the operation 
done successfully , we resolve it, otherwise reject , }) 

然後方法期待一個函數,我們可以通過解析函數傳遞參數。但是預期只有一個參數,所以如果需要多個參數,則需要對象或數組。如果你能理解上面的代碼,讓你重構代碼有點

 getConnection:function(req,res){ 
      return new Promise((resolve,reject)=>{ 
       pool.getConnection(function (err, connection) { 
         if(err) return reject(err); 
         resolve({connection,req,res}); 
      }); 
      }) 
    }, 

    updateProfile:function(obj){ 
     const { connection,req,res } = obj; 
     return new Promise((resolve,reject)=>{ 
      var email = req.body.email; 
      var sql = 'INSERT INTO rw_users SET email = ?'; 
      var params = [email]; 
      connection.query(sql, params, function (err, results, fields) { 
        if (err) return reject(err); 
        resolve({email,results,connection}); 
      }); 
     }) 
    }, 

    createCustomerProfile: function (obj) { 
        const { email,results,connection } = obj; 
        return new Promise((resolve,reject)=>{ 
         merchant.createCustomerProfile(email, results.id, function callback(merchantRes){ 
           var sql = 'UPDATE rw_user SET auth_customer_id = ? WHERE email = ?'; 
           var params = [merchantRes, email]; 
           connection.query(sql, params, function (err, results, fields) { 
             if (err) { 
               throw err; 
             } 
             console.log('new customer created at authorize.net'); 
             connection.release(); 
           }); 
        }); 
        }) 
    } 

    yourModule.getConnection(req,res) 
       .then(yourModule.updateProfile) 
       .then(yourModule.createCustomerProfile) 
       .catch((err)=>{console.log(err)}) 

現在,你需要這樣才符合你的模塊的作品修改此代碼。

+0

非常感謝您花時間幫助我。 – wuno