2016-10-06 5 views
-1

Ich erhalte Werte aus einer fernen Tabelle, die ich in ein Array geschoben:Versprechen in NodeJs, wie bekomme ich den Rückgabewert?

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; 
    }); 
} 

Jetzt, mit promiseJs ich ein Versprechen Funktion gemacht, da der Aufruf asynchron:

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

Nun, was ich will zu tun ist, diesen Tab zu verwenden! Aber wenn ich eine var wie das Erstellen und trösten sie log:

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

, dass das Ergebnis in cmd ist:

Versprechen {_45: 0, _81: 0, _65: null, _54: null}

Was bedeutet es? Warum habe ich den Tab nicht angezeigt? Was muss ich tun, um den Rückgabewert meiner Funktion zu erhalten?

Vielen Dank.

ps: Ich half mysefl mit dieser Website https://www.promisejs.org/, um das Versprechen zu schreiben.

+0

Sie können Ihre Variablen natürlich beliebig benennen, aber * überwältigend *, die Namen, die für die Argumente verwendet werden, die dem Callback des Verspre- chungskonstruktors übergeben werden, sind normalerweise 'resolve' und 'reject'. –

+1

'getrecords' sollten entweder einen Callback aufrufen oder ein Versprechen zurückgeben. Gerade jetzt tut es auch nicht. – Wex

Antwort

0

GetRecords sollte ein Versprechen zurückkehren, damit ich tat:

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"); 
     }); 
    }); 
} 

Danach habe ich die Methode von "then" wie folgt gefolgt anrufen:

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

Es funktionierte.

2

Sie verwenden das Argument für den Rückruf Sie then passieren:

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

Versprechungen nicht asynchronen Code synchron. Sie erleichtern nur die Arbeit mit asynchronem Code.

+0

Ich verstehe jetzt mehr mit Ihrem letzten Satz. Aber wenn ich dann so übersetze: readRecords (base, view) .dann (function (res) { console.log (res);} passiert nichts in der Konsole. Ich werde weiter nachforschen. – hhelbawi

+0

Hallo, ich vermisse vielleicht ein Punkt hier ... Nichts wird in der Eingabeaufforderung angezeigt .. wenn ich ein Konsolenprotokoll in der Bedingung schreiben, wenn (err) oder in der else, wird auch nichts angezeigt.Wenn ich jedoch eine Console-Log in die Getrecords-Methode, die ich habe Im Grunde, wenn die Funktion readRecords getrecords erreicht, zeigt es auf der Eingabeaufforderung das Ergebnis des Protokolls an und das ist es. Es erreicht nicht die Ablehnung oder erfüllt. Muss ich eine neue Frage dazu stellen? Ich hier in der Kommentare sind in Ordnung? Danke. – hhelbawi

+1

@hhelbawi: Wenn Sie erwarten, dass Ihre 'getrecords' * die Informationen der asynchronen Anrufe * zurückgeben, kann das nicht passieren. Siehe [* Wie gebe ich die Antwort von einem asynchronen Anruf zurück? *] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-f rom-asynchroner Anruf) –

Verwandte Themen