2016-02-19 7 views
5

Sto guardando un'applicazione Koa.js/Node.js e penso di avere una buona conoscenza dei generatori e delle promesse. Ma non posso avvolgere la testa intorno il seguente codice:In che modo yield capisce Promises in un'applicazione Node.js/Koa.js?

function *parseAuthorization() { 
    let parameters = this.query; 
    let accessToken = yield storakleShopifyApi.exchangeTemporaryToken(parameters); 

    if(accessToken) { 
     return ... 
    } 
    return this.response.redirect("/home/"); 
}; 

Procedimento exchangeTemporaryToken è il seguente:

function* exchangeTemporaryToken(query) { 
    let authApi = getAuthApi(query.shop); 
    return new Promise(function (resolve, reject) { 
     authApi.exchange_temporary_token(query, function (err, data) { 
      if (err) { 
       return reject(err); 
      } 
      return resolve(data['access_token']); 
     }); 
    }); 
}; 

* parseAuthorization è ovviamente funzione generatore (un'azione API in questo caso) che blocca su questa linea:

let accessToken = yield storakleShopifyApi.exchangeTemporaryToken(parameters); 

lo storakleShopifyApi.exchangeTemporaryToken è un'altra funzione del generatore che restituisce abbastanza interessante una promessa.

Ma la resa di per sé non comprende le promesse, vero? Sono anche supponendo che la chiamata a:

storakleShopifyApi.exchangeTemporaryToken(parameters); 

Returns:

IteratorResult {value: Promise..., done: true} 

Così come resa gestire questo e assegna il valore risolto dalla promessa alla variabile access token?

+1

No, la resa non sa nulla di ciò che sta producendo, sia una promessa o qualsiasi altra cosa. Ma il consumatore del rendimento è il framework koa, che ** fa ** sa che il valore ottenuto è una promessa, aspetta che si risolva, quindi passa il valore risultante al generatore nella prossima chiamata a 'next', che ha l'effetto di renderlo il "valore" del rendimento e quindi assegnato a 'accessToken'. Questo comportamento è al centro del koa. –

risposta

2

ho mai pensato che andare oltre la prima pagina dei risultati di ricerca di Google ha avuto alcun valore, ma credo di aver trovato la risposta alla mia domanda c'è:

http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/

Citando da questo post:

"Ed è così che funziona Koa - il tuo codice applicazione è il generatore, emette una serie di promesse (o altre cose che mostrerò qui sotto), e Koa aspetta che ognuno completi prima di riprendere il tuo codice (restituendoti il ​​codice risultato del compito precedente). "

Quindi è Koa che è la colla tra resa e promesse.