2015-12-29 180 views
4

我在嘗試使功能details()根據可用事件查找某些事件的細節(getdetails)。在下面的示例中,將詢問具有ID ZRGZZ,RGHER和GRFDZ的事件的詳細信息。這些細節應放置在一個數組中(信用額度爲Theodore's answer)。結果應該是,當我打電話給details()時,結果數組被存儲,所以我可以在以後使用它。我不知道如何返回這個最終數組。在數組構造完成之前執行console.log(JSON.stringify(res));。我知道這可能有事情做異步JS,但我不能換我的頭周圍...異步javascript問題

function details() 
{ 
    var res = { 
    "Result": "success", 
    "Key": "12345", 
    "Data": [{ 
     "ID": "ZRGZZ", 
     "lastChangedDate": "2015-12-03 11:14:27" 
    }, { 
     "ID": "RGHER", 
     "lastChangedDate": "2015-12-03 15:17:47" 
    }, { 
     "ID": "GRFDZ", 
     "lastChangedDate": "2015-12-03 05:25:11" 
    }] 
}; 

    var i = 0; 
    var tmp; 
    res.Data.map(function(val,i){ 

     getdetails(val.ID).then(function(data){ 
      tmp = JSON.parse(data); 
      console.log(tmp); 
      Object.keys(tmp.Data[0]).map(function(v,j){ 
       val[v] = tmp.Data[0][v]; 
       console.log(JSON.stringify(res)); //(*)the last res gives me the result I'm looking for 
      }); 

     }, function(error){ //error callback 
      console.log(error) 
     }); 


    }); 
console.log(JSON.stringify(res)); //this is executed before (*) 
} 
+0

試試這個:https://jsfiddle.net/rayon_1990/ks3vxomu/ – Rayon

+0

我在你的標籤中看到了角度,如果你能夠使用角度,使用$ http.get進行異步調用非常容易,它給你一個承諾(你需要的對象) – luk492

+0

@RayonDabre,似乎改變我的數據結構 – binoculars

回答

0

那麼你已經在使用的承諾 - 看在你的代碼then,如果它的角,然後then本身返回延期的承諾,所以你可以這樣做:

res.Data.map(function (val, i) { 
    getdetails(val.ID).then(function (data) { 
     tmp = JSON.parse(data); 
     Object.keys(tmp.Data[0]).map(function (v, j) { 
      val[v] = tmp.Data[0][v]; 
     }); 
    }, function (error) { //error callback 
     console.log(error) 
    }).then(function() { 
     console.log(JSON.stringify(res)); 
    }) 
}); 

編輯:注射服務$q到您的控制器或服務

promises = []; 
res.Data.map(function (val) { 
    promises.push(getdetails(val.ID).then(function (data) { 
     tmp = JSON.parse(data); 
     Object.keys(tmp.Data[0]).map(function (v, j) { 
      val[v] = tmp.Data[0][v]; 
     }); 
    }, function (error) { //error callback 
     console.log(error) 
    })); 
}); 
$q.all(promises).then(function() { 
    console.log(JSON.stringify(res)); 
}); 

現在,當所有的getdetails都解決了,你可以CONSOLE.LOG或做任何你想要的數據

+0

感謝您的回覆!這似乎工作!唯一不理想的是它'console.log(JSON.stringify(res));'被執行了x次(x是它要搜索的ID的數量)。 – binoculars

+1

我會用一點更復雜的解決方案來更新我的答案,以解決這個問題 – maurycy

+0

我試過你的更新答案,但現在'res'只保存第一個事件的細節。 – binoculars

1

一種方法是使用async庫,特別是async.eachasync.eachSeries功能。 (你可以使用async.map,但在你的情況其實並不映射,而是直接修改底層數組項)

特別是,你的代碼應該是這樣的:

async.each(res.Data, function(val,callback){ 
    getdetails(val.ID).then(function(data){ 
     tmp = JSON.parse(data); 
     Object.keys(tmp.Data[0]).map(function(v,j){ 
      val[v] = tmp.Data[0][v]; 
     }); 
     callback(null); // Asynchronous code has finished without error 
    }, function(error){ //error callback 
     callback(error); // Asynchronous code has finished with error 
    }); 
}, function(error) { 
    // All asynchronous calls have finished 
    if(error) 
     console.log("Error", error); 
    else 
     console.log("Success", res); 
}); 

async.each將運行許多迭代同時進行,而async.eachSeries將只同時運行一次迭代。