2016-12-21 8 views
1

Ich habe die letzten paar Stunden völlig festgefahren.Argumente an eine Generatorfunktion übergeben

Wie Parameter an eine Generatorfunktion übergeben werden?

function* getFoo(foo) { 
    return yield Promise.resolve(foo + 10); 
} 

exports.testRoute = Promise.coroutine(function* (req, res) { 
    let bar = yield Promise.coroutine(getFoo); // <--- how to pass argument?? 
    res.send(bar.toString()); 
}); 

aktuellen Code wirft Fehler (und ich weiß, er zeigt mir here aber es sagt nichts über Argument passing):

Unhandled rejection TypeError: A value [object Promise] was yielded that could not be treated as a promise 
    See http:// goo.gl/4Y4pDk 
From coroutine: 
    at Function.module.exports.Promise.coroutine (d:\Workspace\Github\API-NodeJS\app\node_modules\bluebird\js\main\generators.js:111:17) 

Wenn ich dies tun:

let bar = yield Promise.coroutine(getFoo(5)); 

Ich bekomme folgenden Fehler (wieder selbsterklärend Fehler, aber this link erklärt nicht Argument übergeben entweder):

Unhandled rejection TypeError: generatorFunction must be a function 
    See http:// goo.gl/6Vqhm0 
    at Function.module.exports.Promise.coroutine (d:\Workspace\Github\API-NodeJS\app\node_modules\bluebird\js\main\generators.js:107:15) 
+0

Ich mag den Kontext missverstehen, aber kannst du nicht einfach 'promise.coroutine (getFoo.bind (null, 5))' 'ausgeben? – LINKIWI

+0

@LINKIWI Nein, ich bekomme den ersten Fehler ** Ein Wert [Objekt Versprechen] wurde erbracht ... ** – Shaharyar

Antwort

1

Ich glaube, was Sie wollen, ist dies:

function* getFoo(foo) { 
    return yield Promise.resolve(foo + 10); 
} 

exports.testRoute = Promise.coroutine(function* (req, res) { 
    let bar = yield Promise.coroutine(getFoo)(50); 
    res.send(bar.toString()); 
}); 

Sie müssen verstehen, was Promise.coroutine tut. Es braucht einen Generator und gibt eine Funktion zurück, die ein Versprechen zurückgibt.

Wie Sie sehen im ersten Fall (yield Promise.coroutine(getFoo);) Sie sind das Ergebnis der Promise.coroutine ergeben, die eine Funktion und kein Versprechen, die in dem Fehler führt:

A value [object Promise] was yielded that could not be treated as a promise 

Im zweiten Fall (yield Promise.coroutine(getFoo(5));), initiieren Sie gerade Ihren Generator. getFoo(5) gibt ein "generator" -Objekt zurück, aber Promise.coroutine möchte eine "generator function", die folgendes ergibt: generatorFunction must be a function.

Die Tatsache Bluebird zeigt das Ergebnis von Promise.coroutine als [object Promise] trägt viel zur Verwirrung bei, da Promise.coroutine sollte stattdessen eine Funktion zurückgeben, aber ich konnte es nicht herausfinden. Ich schätze, du könntest es als eine andere Frage stellen.

+0

Yup, erst kürzlich herausgefunden. Ich habe nicht erwartet, dass es so einfach ist. – Shaharyar

+0

Hmm, ich vermute es liegt daran, dass bluebird ein "Versprechen" neben dem "yield" Schlüsselwort * erwartet (wie Sie sehen können, habe ich meinen 'testRouter' in' Promise.coroutine' eingeschlossen) * – Shaharyar

Verwandte Themen