2015-09-10 2 views
0

У меня возникли проблемы с попыткой вернуть результаты обещания в качестве возврата к исходному абоненту.Выход из конечной области обещания изнутри функции генератора

store.js

module.exports = { 
    find: function *(storeRequest){ 
     if(!_gateway){ 
      _gateway = realGateway; 
     } 

     storeResponse.http.statusCode = 200; 

     var stores = _gateway.find(storeRequest.id).next().value; // I want to be able to get the stores array back here ultimately by calling next() like I am trying to do here 

     console.log(stores[0]); 
     //yield storeResponse; 
    } 
}; 

storeGateway.js

module.exports = { 
     find: function *(id){ 
      var stores = []; 
      var entity; 

      database.find.then(function(foundStores){ 

        entity = testUtil.createStore(foundStores[0].id, foundStores[0].name); 
        console.log("ENTITY:"); 
        console.log(entity); 

        stores.push(entity); 

        console.log("STORES[0]:"); 
        console.log(stores[0]); 

// I am getting the results here successfully so far when I console.log(stores[0])! But now I want to return stores now from here and yield the array so it propogates up to the caller of storeGateway's find() 
        // yield entity; --- this doesn't work because I think I'm in the promise then scope 
       } 
      ); 

      //yield entity; -- and this definitely won't work because it's not in the promise callback (then) 
     } 
    }; 

database.js

var co = require('co'); 
var pg = require('co-pg')(require('pg')); 
var config = require('./postgreSQL-config'); 

var database = module.exports = {}; 

var _id; 
var _foundStores; 

database.find = co(function* poolExample(id) { 

     var query = "Select id, name from stores"; 

     try { 
      var connectionResults = yield pg.connectPromise(config.postgres); 
      var client = connectionResults[0]; 
      var done = connectionResults[1]; 

      var result = yield client.queryPromise(query); 
      done(); 

      console.log("PRINTING ROWS:"); 
      console.log(result.rows[0]); 

      _foundStores = yield result.rows; 

     } catch(ex) { 
      console.error(ex.toString()); 
     } 

     console.log("RESULTS!:"); 
     console.log(_foundStores); 

     return _foundStores; 
    }); 

я получаю PRI данных на каждом console.log вы видите выше. Я просто не знаю, как вернуть магазины из метода find() storeGateway, так как он получает массив магазинов в результате обещания (в .then()), и мне нужно уметь возвращать его обратно вверх.

(см. Мой комментарий в коде, я пытаюсь вернуть найденные магазины в то, что было обещано тогда назад по течению от моей функции store.js find generator).

+0

'_foundStores = result.rows доходности;' не имеет никакого смысла, если вы ранее уже делали доступа 'result.rows [0]'. Зачем ты это делаешь? Что такое 'rows [0]' в журнале (или: что вы ожидаете от него)? – Bergi

+0

Yea, что предыдущий был просто тестированием – PositiveGuy

ответ

1

Точка с использованием генераторов и co является то, что вы можете yield обещание к сопрограммному бегуну и получить их результаты назад, так что вам не придется использовать then.

Старт путем find метод, в вашем database.js:

database.find = co.wrap(function* poolExample(id) { 
//    ^^^^^ 
    … 
}); 

Тогда в storeGateway.js вы должны делать

module.exports = { 
    find: function*(id) { 
     var foundStores = yield database.find(id); 
     var entity = testUtil.createStore(foundStores[0].id, foundStores[0].name); 
     console.log("ENTITY:", entity); 
     var stores = [entity]; 
     console.log("STORES[0]:", stores[0]); 
     return stores; 
    } 
}; 

(возможно обернуть функцию генератора в co.wrap(…)).

Тогда в store.js вы можете сделать

module.exports = { 
    find: co.wrap(function*(storeRequest) { 
     if (!_gateway) _gateway = realGateway; 
     storeResponse.http.statusCode = 200; 
     var stores = yield* _gateway.find(storeRequest.id); 
     // or  yield _gateway.find(storeRequest.id); if you did wrap it and it 
     //             returns a promise, not a generator 
     console.log(stores[0]); 
     return stores; 
    }) 
}; 
+0

Спасибо, что я все еще новичок на генераторах, попробует, спасибо! – PositiveGuy

+0

Получение объекта не является функцией на var foundStores = yield database.find(); – PositiveGuy

+0

Да, это не работает. Я продолжаю получать объект, не является функцией снова после того, как я завернул store.js с co слишком – PositiveGuy

-1

Существует два способа сделать это. Вы либо получаете параметр обратного вызова в свою функцию, и называете его, когда обещание разрешено (внутри вашей функции) или лучше, возвращайте результат. то() возвращает сам себя обещание и все, что вы возвращаетесь из с в функции доступны для последующих функций прикованных к обещанию, так что если вы сделаете это

return database.find.then(function(foundStores){ 
     entity = testUtil.createStore(foundStores[0].id, foundStores[0].name); 
     console.log("ENTITY:"); 
     console.log(entity); 
     stores.push(entity);  
     console.log("STORES[0]:"); 
     console.log(stores[0]); 
     return stores[0]; 
} 

, то вы могли бы сделать gateway.find(). Затем (функция (магазины) {}), а магазины - это то, что вы вернули, т.е. сохраняет [0].