2016-02-22 22 views
6

Tôi đang sử dụng Syncano làm trừu tượng, nơi tôi đang cố gắng gọi API bên ngoài để nhận mảng JSON. JSON này cần phải được phân tích cú pháp và sau đó được lưu trữ trong syncano. Trước đó tôi cần nhận đối tượng tham chiếu từ DB để liên kết nó với đối tượng nhóm mới.Syncano Codebox - Gọi API - phân tích cú pháp JSON - nhận tham khảo - Lưu đối tượng mới

Tôi nhận được mảng nhóm (json) & đối tượng tham chiếu thành công. Nhưng tôi không thể lấy dữ liệu mới được lưu trữ, vì chỉ có 12-14 đội (phải là 18) mới được cứu.

Tôi đã thử điều này & với lời hứa nhưng nó không hoạt động. Bất cứ ai một lời khuyên tốt làm thế nào để viết lại mã để lưu trữ tất cả dữ liệu? Cảm ơn bạn - đây là những gì tôi có cho đến nay ...

//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

bạn có thời gian thực hiện của phiên bản hiện tại của mã? –

+0

Vâng, đó là 2002 ms @KellyJAndrews – Burkart

+0

Mã của bạn trông cơ bản ok - tôi nghĩ rằng nó có thể là 15 req/giây bạn đang va vào đây. –

Trả lời

4

Vấn đề này có thể là bạn đang hoàn tất quá trình yêu cầu trước khi tất cả các lưu cuộc gọi được thực hiện, bạn có thể thử 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); 
     }); 

nếu quá nhiều cuộc gọi song song tại một thời điểm là vấn đề sau đó chuỗi một cuộc gọi sau khi khác:

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

Đối với người đầu tiên tôi nhận được: "[TypeError: Không thể đọc tài sản 'đẩy' của undefined]" - hiện tại tôi không thể tìm ra nơi này đến từ đâu. Đối với cái thứ hai, một nhóm được lưu trữ nhiều lần, Có vẻ như vòng lặp chạy 18 lần và sau đó phương thức add() chỉ chạy cho 1 đối tượng nhiều lần. Tuy nhiên, tôi vẫn nhận được thông báo "Yêu cầu được điều chỉnh". – Burkart

+0

@Burkart mã lỗi, cập nhật của tôi, đầu tiên tôi không khởi tạo 'lời hứa', mã thứ hai có vấn đề đóng cửa, tôi cũng đã thêm khoảng cách 500ms giữa hai lần lưu trong phương thức thứ hai ... – mido

+0

Cảm ơn bạn rất nhiều! Điều đó đã hiệu quả! – Burkart

Các vấn đề liên quan