2016-02-22 33 views
6

मैं सिंकानो को बास के रूप में उपयोग कर रहा हूं, जहां मैं एक JSON सरणी प्राप्त करने के लिए बाहरी API को कॉल करने का प्रयास कर रहा हूं। इस JSON को पार्स किया जाना चाहिए और बाद में सिंकानो में संग्रहीत किया जाना चाहिए। इससे पहले मुझे डीबी से संदर्भ वस्तु को नई टीम ऑब्जेक्ट से जोड़ने की आवश्यकता है।सिंकानो कोडबॉक्स - कॉल एपीआई - पार्स जेएसओएन - संदर्भ प्राप्त करें - नए ऑब्जेक्ट्स सहेजें

मुझे टीम (जेसन) सरणी & संदर्भ वस्तु सफलतापूर्वक प्राप्त होती है। लेकिन मैं नए डेटा को संग्रहीत करने में असमर्थ हूं, क्योंकि केवल 12-14 टीमें (18 वर्ष होनी चाहिए) बचाई गई है।

मैंने इस & को आजमाया कि वादे के साथ लेकिन यह काम नहीं कर सका। कोई भी अच्छी सलाह देता है कि सभी डेटा स्टोर करने के लिए कोड को फिर से लिखना कैसे है? धन्यवाद - यहाँ है क्या मैं अब तक है ...

//TODO: get from ARGS when executing this codebox 
var teamKey = 394; 
var requestURL = 'http://api.football-data.org/v1/soccerseasons/' + teamKey + "/teams"; 

var request = require("request"); 
var Syncano = require('syncano'); 
var Promise = require('bluebird'); 
var account = new Syncano({ 
    accountKey: "abc" 
}); 
var promises = []; 

//from: http://docs.syncano.io/v1.0/docs/data-objects-filtering 
//"_eq" means equals to 
var filter = { 
    "query": { 
    "apikey": { 
     "_eq": apiKey 
    } 
    } 
}; 

request({ 
    headers: { 
    'X-Auth-Token': 'abc' 
    }, 
    url: requestURL, 
    'Content-Type': 'application/json;charset=utf-8;', 
    method: 'GET', 
}, function(error, response, body) { 
    if (error) { 
    console.log(error); 
    } else { 
    var json = JSON.parse(body); 
    var teamArray = json.teams; 
    var newObject; 

    account.instance('instance').class('competition').dataobject().list(filter) 
    .then(function(compRes) { 

     var competitionID = compRes.objects[0].id; 
     for (var i = 0; i < teamArray.length; i++) { 
      newObject = { 
      "name": teamArray[i].name, 
      "nameshort": teamArray[i].code, 
      "logo": teamArray[i].crestUrl, 
      "competition": competitionID 
      }; 

      (account.instance('instance').class('teams').dataobject().add(newObject).then(function(res) { 
       console.log(res); 
      }).catch(function(err) { 
       console.log("Error eq: " + err); 
      }) 
     ); 
     } 
     }).catch(function(err) { 
     console.log(err); 
     }); 
    } 
}); 
+0

आप कोड के वर्तमान संस्करण के निष्पादन के समय है? –

+0

हां, यह 2002 एमएस @ केली जेन्ड्रूज़ – Burkart

+0

आपका कोड मूल रूप से ठीक दिखता है - मुझे लगता है कि यह 15 रिक/सेकंड हो सकता है जिसे आप यहां पर टक्कर दे रहे हैं। –

उत्तर

4

समस्या हो सकती है आप अनुरोध प्रक्रिया खत्म कर रहे हैं से पहले सभी को बचाने के कॉल किया जाता है, तो आप Promise.all() की कोशिश कर सकते:

account.instance('instance').class('competition').dataobject().list(filter) 
    .then(function(compRes) { 

     var competitionID = compRes.objects[0].id, promises=[]; 
     for (var i = 0; i < teamArray.length; i++) { 
      newObject = { 
      "name": teamArray[i].name, 
      "nameshort": teamArray[i].code, 
      "logo": teamArray[i].crestUrl, 
      "competition": competitionID 
      }; 
      promises.push(account.instance('instance').class('teams').dataobject().add(newObject).then(function(res) { 
       console.log(res); 
      }).catch(function(err) { 
       console.log("Error eq: " + err); 
      }) 
     ); 
     } 
     return Promise.all(promises); 
     }).catch(function(err) { 
     console.log(err); 
     }); 

अगर एक बार में भी कई समानांतर कॉल मुद्दा है तो एक के बाद एक कॉल श्रृंखला:

account.instance('instance').class('competition').dataobject().list(filter) 
    .then(function(compRes) { 

     var competitionID = compRes.objects[0].id, promise = Promise.resolve(); 
     function chainToPromise(promise, teamObj, waitTime){ 
      waitTime = waitTime || 500; 
      return promise.then(function(){ 
      return new Promise(function(resolve, reject){ 
       setTimeout(resolve, waitTime); 
      }); 
      }).then(function(){ 
      return account.instance('instance').class('teams').dataobject().add(teamObj); 
      }).then(function(res) { 
      console.log(res); 
      }).catch(function(err) { 
      console.log("Error eq: " + err); 
      }); 
     } 
     for (var i = 0; i < teamArray.length; i++) { 
      newObject = { 
      "name": teamArray[i].name, 
      "nameshort": teamArray[i].code, 
      "logo": teamArray[i].crestUrl, 
      "competition": competitionID 
      }; 
      promise = chainToPromise(promise, newObject); 
     } 
     return promise; 
     }).catch(function(err) { 
     console.log(err); 
     }); 
+0

पहले के लिए मुझे मिलता है: "[TypeError: अपरिभाषित की संपत्ति 'पुश' नहीं पढ़ सकता]" - वर्तमान में मैं यह नहीं समझ सकता कि यह कहां से आता है। दूसरे के लिए, एक टीम कई बार संग्रहीत हो जाती है, ऐसा लगता है कि लूप 18 गुना चलता है और बाद में ऐड() विधि केवल 1 ऑब्जेक्ट के लिए कई बार चलता है। हालांकि, मुझे अभी भी "अनुरोध थ्रॉटल किया गया" संदेश मिलता है। – Burkart

+0

@ बुर्कर्ट मेरे खराब, अद्यतन कोड, पहले मैंने 'वादे' शुरू नहीं किया था, दूसरे कोड में एक बंद करने का मुद्दा था, मैंने दूसरी विधि में दो सेव कॉल के बीच 500ms का अंतर जोड़ा ... – mido

+0

बहुत बहुत धन्यवाद! वह काम किया! – Burkart

संबंधित मुद्दे