2016-10-06 2 views
-1

Я получаю значение из далекой таблицы, я толкнул в массив:Обещание в nodeJs, как мне получить возвращаемое значение?

function getrecords(base, view) { 
    var tab = []; 
    var jsonTab = {}; 
    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') 
      }); 
     }); 
     //console.log(tab); 
     return tab; 
    }); 
} 

Теперь, с promiseJs я сделал функцию обещания, так как вызов асинхронный:

function readRecords(base, view){ 
    return new Promise(function(fulfill, reject){ 
     getrecords(base, view, function (err, res){ 
      if(err) reject(err); 
      else fulfill(res); 
     }); 
     }); 
} 

Теперь то, что я хочу сделать это, чтобы использовать эту вкладку! Но когда я создаю вар, как это и утешает зарегистрировать ее:

var tabRecord= readRecords(base, view); 
console.log(tabRecord); 

Это результат в ЦМД:

Promise {_45: 0, _81: 0, _65: нуль, _54: NULL}

Что это означает? Почему я не показывал вкладку? Что мне делать, чтобы получить возвращаемое значение моей функции?

Спасибо всем.

ps: Я помог mysefl с этим сайтом https://www.promisejs.org/, чтобы написать обещание.

+0

Вы можете, конечно, перечислить переменные, что угодно, но * в подавляющем большинстве *, имена, используемые для аргументов, предоставленных обратному вызову конструктора обещаний, обычно являются «разрешать» и «отклонять». –

+1

'getrecords' должен либо вызывать обратный вызов, либо возвращать обещание. Сейчас это не так. – Wex

ответ

0

Getrecords должен вернуть обещание, так что я сделал:

function getrecords(base, view) { 
    return new Promise(function(resolve, reject){ 
     var tab = []; 
     base('Table 1').select({ 
      view: view 
     }).eachPage(function page(records, fetchNextPage) { 
      records.forEach(function(record) { 
      //resolve(records); 
       tab.push({ 
        'Name':record.get('Name'), 
        'Notes': record.get('Notes') 
       }); 
      }); 
      fetchNextPage(); 
      resolve(tab); 
      reject("Nononono"); 
     }); 
    }); 
} 

После того, что я могу вызвать метод с последующим "then", как это:

getrecords(base, view).then(function(res){return res;}).then(function(res{tabToCSV(res)}) 

Он работал.

2

Вы используете аргумент обратного вызова вы передаете then:

readRecords(base, view).then(function(tabRecord) { 
    // Use `tabRecord` here 
}); 

Обещания не делают асинхронный код синхронно. Они просто упрощают работу с асинхронным кодом.

+0

Теперь я понимаю больше с вашим последним предложением. Но когда я так прохожу: readRecords (base, view). Then (function (res) { console.log (res);} ничего не происходит в консоли. Я буду исследовать дальше. – hhelbawi

+0

Здравствуйте, мне, может быть, не хватает point here ... Ничего не отображается в командной строке. Когда я пишу консольный журнал в условии if (err) или в else, ничего не отображается. Но когда я помещаю консольный журнал в метод getrecords, у меня есть вкладка.Так как в основном, когда функция readRecords достигает getrecords, она отображает в приглашении результат журнала и все. Это не доходит до отклонения или выполнения. Должен ли я задавать новый вопрос об этом? Я здесь, в Комментарии: ok: Спасибо. – hhelbawi

+1

@hhelbawi: Если вы ожидаете, что ваши 'getrecords' возвратят * информацию из асинхронных вызовов, это не поможет. См. [* Как вернуть ответ от асинхронного вызова? *] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-f Rom-ан-асинхронно-вызов) –

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