2017-03-29 8 views
0

Ich möchte meine Versprechen je nachdem, ob der vorherige Anruf gelöst oder abgelehnt wurde, verketten. Ich rufe Server in allen Versprechungen an. Also, ich schreibe es wie-Bedingte Verkettung von Versprechungen

apiServices.patientsSearch(id) 
.then(function(data){ 
    return callback(null,data); 
},function(err){ 
    return apiServices.studiesSearch(id); 
}).then(function(data){ 
    return callback(null,data); 
},function(){ 
    return apiServices.seriesSearch(id); 
}).then(function(data){ 
    return callback(null,data); 
}) 
.catch(function(err){ 
    return callback(false,err); 
}); 

Wie jeder dann ein Versprechen Objekt zurückgibt, Problem ist, dass Fang immer dann aufgerufen wird, wenn überhaupt Versprechen außer dem letzten Willen nennt. Eine Möglichkeit, die ich denke, ist zu überprüfen, ob err leer ist und es zu ignorieren. Ist es der richtige Weg?

I Anforderungsmodul verwenden, wenn ich gesetzt für immer: true, beginne ich getting-

{ [Error: socket hang up] code: 'ECONNRESET' } 

Mit immer falsch, es funktioniert. Warum ist mein Socket auch nach dem Ende der Anfrage noch besetzt? Da die nächste Anfrage nur ausgeführt wird, wenn die Zurückweisung aufgerufen wird, sollte Socket zu diesem Zeitpunkt frei sein.

+0

Was ist 'Rückruf (null, Daten)'? – Bergi

+0

@Bergi Callback-Funktion, um Daten mit Fehler oder Ergebnis an den Controller zu übergeben. – krrish

+0

Ich habe nicht verstanden, dass Fang immer aufgerufen wird, wenn irgendein Versprechen, außer dem letzten Anruf, aufgelöst wird. Kannst du etwas mehr erklären? – John

Antwort

1

Sie sollten nur die callback einmal anrufen. Geben Sie es nicht als onfulfilled-Handler nach jedem Versprechen, nennen Sie es einmal am Ende:

apiServices.patientsSearch(id).then(null, function(err){ 
    return apiServices.studiesSearch(id); 
}).then(null, function(){ 
    return apiServices.seriesSearch(id); 
}).then(function(data){ 
    callback(null,data); 
}, function(err){ 
    callback(false,err); 
}); 

oder

apiServices.patientsSearch(id).catch(function(err){ 
    return apiServices.studiesSearch(id); 
}).catch(function(){ 
    return apiServices.seriesSearch(id); 
}).then(function(data){ 
    callback(null,data); 
}, function(err){ 
    callback(false,err); 
}); 

Natürlich sollten Sie keine Rückrufe anrufen überhaupt in Versprechungs-basierter Code, verwenden Sie dies also nur, wenn Sie mit Legacy-Code interagieren müssen. Andernfalls nehmen nicht callback Parameter und nur return das Versprechen:

return apiServices.patientsSearch(id).catch(function(err){ 
    return apiServices.studiesSearch(id); 
}).catch(function(){ 
    return apiServices.seriesSearch(id); 
});