2016-08-23 74 views
0

我是新來的節點js,我想用異步模塊來消除setTimeouts。我在這裏面臨一個問題。它沒有按預期工作。它甚至在第一個函數完成執行之前調用第二個函數。我搜索了答案並嘗試了多種方式。但它似乎並不奏效。即使在async.forEach完成之前,它也會打印「異步系列中的內部數據庫插入」。任何人都可以檢查代碼並告訴我哪裏出錯了?嵌套異步沒有按預期執行

setTimeout(function() { 
    async.series([function(callback1) { 
       console.log("Inside async series"); 
       try { 
        var msg = ""; 
        var datas = []; 
        for (var i = 0; i < service_name.length; i++) { 
         console.log("Inside for loop service names"); 
         var child = { 
          "space_guid": space_guid, 
          "name": service_name[i], 
          "service_plan_guid": service_plan_guid[i] 
         }; 
         datas.push(child); 
         console.log("datas array===" + JSON.stringify(datas)) 
        } 
        async.forEach(datas, function(data1, callback) { 

         console.log("Inside async task"); 
         var data = JSON.stringify(data1); 
         console.log("data value===" + JSON.stringify(data)); 
         var options = { 
          host: 'api.ng.bluemix.net', 
          path: '/v2/service_instances' + 
           '?accepts_incomplete=true', 
          method: 'POST', 
          headers: { 
           'Authorization': full_token_new 
          } 

         }; 
         console.log("options is" + JSON.stringify(options)); 
         var reqst = http.request(options, function(res) { 
          console.log("Sent for request"); 
          res.setEncoding('utf8'); 
          res.on('data', function(chunk) { 
           msg += chunk; 

          }); 
          res.on('end', function() { 
           try { 
            console.log("message =======", msg); 
            console.log("-----------------------------------------"); 
            msg = JSON.stringify(msg); 
            msg1 = JSON.parse(msg); 
            console.log("printing msg--" + msg1); 
            console.log("-----------------------------------------"); 
            console.log("here i am", i); 
            console.log(service_name.length - 1); 
            callback(); 

           } catch (err) { 
            console.log(err); 
           } 

          }); 
         }); 
         reqst.on('error', function(e) { 
          console.log(e); 
         }); 
         reqst.write(data); 
         reqst.end(); 

        }, function(err) { 

         console.log("for each error" + err); 


        }); 
        callback1(null, null); 
       } catch (err) { 
        console.log(err); 
       } 

      }, 
      function(callback1) { 
       console.log("Inside db insert in async series") 
       db_insert(service_name, solnName, full_token_new, uname, version); 
       callback1(null, null); 

      } 
     ], 
     function(err, results) { 
      if (err) { 
       console.log("There's an error" + err); 
      } else { 
       console.log("result of async", results); 
      } 
     }) 
}, 3000) 
+0

不要將'try ... catch'與異步函數混合使用,它不會像您期望的那樣工作。 – DrakaSAN

+0

把'callback1(null,null);'放在* try *塊中,並放在async.forEach的最後一個函數中,只是在console.log(「對於每個錯誤」+ err);' – Molda

+0

使用'async.each'而不是'async.forEach'。 –

回答

0

您正在使用異步代碼混合try...catch,這是不好的做法,幾乎是不可能做到的權利。

此外,您的錯誤源於您在async.forEach之後調用callback這一事實,因爲它沒有完成,並轉到下一步。

另外,你是什麼意思的「消除超時」?您的整個代碼都在其中,您可以隨時將其刪除。

'use strict'; 

async.series([ 
    (callback) => { 
     let msg = "", 
      datas = [], 
      i = 0; 
     while(i < service_name.length) { 
      let child = { 
       "space_guid": space_guid, 
       "name": service_name[i], 
       "service_plan_guid": service_plan_guid[i] 
      }; 
      datas.push(child); 
      i = i + 1; 
     } 
     async.forEach(datas, (data1, callback) => { 
      let data = JSON.stringify(data1), 
       options = { 
        host: 'api.ng.bluemix.net', 
        path: '/v2/service_instances?accepts_incomplete=true', 
        method: 'POST', 
        headers: { 
         'Authorization': full_token_new 
        } 
       }, 
       reqst = http.request(options, (res) => { 
        res.setEncoding('utf8'); 
        res.on('data', (chunk) => { 
         msg += chunk; 
        }); 
        res.on('end',() => { 
         msg = JSON.stringify(msg); 
         msg1 = JSON.parse(msg); 
         callback(); 
        }); 
       }); 
      reqst.on('error', (error) => { 
       callback(error); 
      }); 
      reqst.write(data); 
      reqst.end(); 
     }, (error) => { 
      callback(error); 
     }); 
    }, 
    (callback) => { 
     db_insert(service_name, solnName, full_token_new, uname, version); 
     callback(); 
    } 
], 
(error, results) => { 
    if (error) { 
     console.log("There's an error" + error); 
    } else { 
     console.log("result of async", results); 
    } 
}); 

由於這種氣味重像plssendzecode的問題,我已經刪除每一個console.log匆匆ES6,以確保您將無法使用它是這樣的,需要閱讀我所做的更改。

+0

我的意思是我通過使用異步消除了許多settimeouts。此外,我刪除了try catch,並將callback1放入函數(err)中。仍然沒有工作:( –

0

我簡化了代碼。
datasprocessData不是好名字。

setTimeout(onTimer, 3000); 

function onTimer() { 
    var datas = service_name.map(function(name, i) { 
     return { 
      space_guid: space_guid, 
      name: name, 
      service_plan_guid: service_plan_guid[i] 
     } 
    }); 

    function processData(data, callback) { 
     var options = { 
      host: 'api.ng.bluemix.net', 
      path: '/v2/service_instances?accepts_incomplete=true', 
      method: 'POST', 
      headers: { 
       'Authorization': full_token_new 
      } 
     }; 

     var reqst = http.request(options, function(res) { 
      var msg = ''; 
      res.setEncoding('utf8'); 

      res.on('data', function(chunk) { 
       msg += chunk; 
      }); 

      res.on('end', function() { 
       try { 
        msg = JSON.parse(msg); 
        callback(null, msg); 
       } catch (err) { 
        callback(err); 
       } 
      }); 
     }); 

     reqst.on('error', callback); 
     reqst.write(JSON.stringify(data)); 
     reqst.end(); 
    } 

    async.map(datas, processData, function(err, results) { 
     if (err); 
      return console.log(err); 
     // process msg of each request db_insert(...); 
    }); 
};