2016-10-06 2 views
1

Прежде всего, я новичок в NodeJS и хочу вникать в мои навыки. У меня есть стол в Airtable и хочу получить от него все элементы. Легко с airtable api для nodejs. Но то, что я хочу сделать, это нажать и сохранить эти элементы в закладке для будущего (JSON, excel ...). Для этого я использую callbaks, так как вызов асинхронный .. Я слышал о Обещании, но это очень ново для меня, и я с трудом uderstanding это .. Вот мой код сейчас:Слишком много обратных вызовов .. nodeJS airtbale api

var Airtable = require('airtable'); 
Airtable.configure({ 
    endpointUrl: 'https://api.airtable.com', 
    apiKey: 'keyKWYJPOEObWhNt2' 
}); 
var base = Airtable.base('app4qIwfmG0ZKAdBH'); 
var view = "Main View"; 


var tab = []; 
base('Table 1').select({ 
    view : view}).eachPage(function page(records, fetchNextPage){records.forEach(function(record){ 
     tab.push({ 
      "Name": record.get('Name'), 
      "Notes": record.get('Notes') 
     }); 
    }); 
    fetchNextPage(); 
    pushToArray(tab); 
}, function done (error){ 
    if(error){ console.log(error); 
     console.log(tab);} 
}); 

function pushToArray(tab) { 
    TabToJson(tab); 
    return tab; 
}; 

function TabToJson(tab){ 
    console.log(tab); 
    return JSON.stringify(tab); 
}; 

Как я могу реализовать обещания? Это необходимо здесь? Я не хочу, чтобы в итоге оказалось дюжина функций обратного вызова. Спасибо всем, и у меня хороший день!

+1

Это будет удобно для вас: https://www.promisejs.org/ – deeveeABC

+0

Хотя я большой поклонник [Bluebird] (http://bluebirdjs.com) для обещаний, вам было бы намного проще если вы придумали лучший способ организации вашего кода обратного вызова, так что происходит более очевидно. – tadman

ответ

2

Осторожно! Вы на правильном пути, понимая, что эта функция является асинхронной, и что вы хотите подождать, пока каждая итерация #eachpage не будет решена до написания вывода вашего JSON, как обещание. Но Airtable был достаточно любезен, чтобы обеспечить уже то, что вы ищете: обратный вызов

function done (error){ 
    if(error){ console.log(error); 
    console.log(tab); 
    } 
} 

будет работать сразу после последнего успешного вызова #fetchNextPage. Здесь вы должны иметь логику JSON-записи. Вы хотели бы что-то вроде

function done (error){ 
    TabToJson(tab); 

    if(error){ console.log(error); 
    console.log(tab); 
    } 
} 

Вам не нужна ваша функция pushToArray, как вы уже подтолкнуло отдельные записи из Airtable в массиве «вкладки» в каждом вызове #page. Кроме того, если вы хотите сделать больше, чем регистрировать свой вывод JSON, который, по вашему мнению, кажется, вам нужно посмотреть в Node. проверьте метод fs # writeFile.

+1

Я сделал свой путь с обещаниями, но +1 к вашему решению, которое также выполняет эту работу! Теперь я задаюсь вопросом, какой способ будет самым умным. – hhelbawi

Смежные вопросы