2017-11-10 1 views
-2

Ich habe 2 Rückruf innerhalb eines anderen.Javascript node.js Variable vom Rückruf an äußere Variable zuweisen

service.call(data).then(result=>{ 

var err=''; 
service2.call(result.data, (result2,error)=>{ 
    //I want to assign error to err 
}) 
}) 

Wie kann ich die innere Variable der äußeren Variablen zuweisen?

+1

@ibrahimmahrir Rückruf aufgerufen wird, wenn die Funktion getan hat, was sein angenommenes, dann glaube nicht, dass ich diese Rückrufe asynchron aufgerufen werden, wenn sie innerhalb Rückruf verschachtelt sind, hat die Verbindung andere Geschichte – wrangler

+0

@avalon wenn Sie tun 'err = error' im zweiten Callback funktioniert es so wie es sein soll, aber wenn irr irgendwo anders benutzt wird, bevor der Callback Wert zurückgegeben hat, wird es undefiniert sein. Daher hängt es davon ab, was hinter "err = error" steckt. – wrangler

+0

@wrangler Es ist höchstwahrscheinlich eine asynchrone Funktion gemäß der Nodejs-Philosophie. Und OP hat wahrscheinlich schon versucht, den Wert selbst zuzuordnen. –

Antwort

-1

Sie können es einfach mit err = Fehler Zuordnung in Service2 Callback tun. Ein weiteres Problem ist, dass die Variable err nur innerhalb des Rückrufs des ersten Dienstes existiert, so dass es unklar ist, wie Sie es verwenden werden. Wie auch immer, ich habe ein paar Scheindienste entworfen, um zu zeigen, dass die Aufgabe funktioniert.

// this is mock 'service' 
const service = { 
    call: (data) => { 
     console.log('service is called with "' + data + '"'); 
     // returning Promise because 'then' is used in consuming code 
     return new Promise((resolve, reject) => { 
      setTimeout(() => resolve({ data: '"This is result of call to service"' }), 1000); 
     }) 
    } 
} 

// this is mock 'service2' 
const service2 = { 
    // no Promise here because there is no 'then' in consuming code 
    call: (data, callback) => { 
     console.log('service2 is called with ' + data); 
     //setTimeout(() => callback('"This is result of call to service2 with ' + data + '"'), 1000); // this would be success scenario 
     setTimeout(() => callback(null, "service 2 failed"), 2000);  // this is a failure scenario 
    } 
} 

// now call the services 
service.call('data').then(result => { 
    console.log("service completed with " + JSON.stringify(result)); 
    var err = ''; 
    service2.call(result.data, (result2, error) => { 
     if (error) { 
      console.log('service2 failed with message "' + error + '"'); 
      err = error; 
     } 
    }) 

    // we're setting timeout big enough for service2 to complete to give it a chance to chang err variable before it's written to console 
    setTimeout(() => { 
      console.log('ultimate value of "err" variable is "' + err + '"'); 
     }, 
     5000  // you may try it with 1000 delay to see unchanged value 
    ) 
})