2015-04-10 4 views
1

У меня есть Promise, и я не могу заставить yield работать рядом с ним. Я смотрю много документов/учебников, и я не думаю, что я все еще это понимаю. Я не уверен, какая часть ошибочна.Получение обещаний и доходность для совместной работы

Из того, что я прочитал, мне нужно next().value при вызове моего генератора, так это то, что я делаю в этой функции:

exports.query = function(sql, values){ 
    var q2 = query2(sql, values); 
    return q2.next().value; 
}; 

Далее я имею generator, которая содержит yield:

function* query2(sql, values){ 
    yield doQuery(sql, values); 
}; 

Наконец я выполнить запрос и сохранить его в Promise()

function doQuery(sql, values){ 
    return new Promise(function(resolve, reject){ 
     conn.query(sql, values, function(err, r){ 
      if(err){ 
       reject(err); 
      }else{ 
       resolve(r); 
      } 
     }); 
    }).then(function(r){return r;}); 
} 

Теперь, когда я хочу использовать это, я называю это так:

var rows = conn.query("select * from groups"); 
console.log(rows); 

Результат console.log() является

{} 

Я знаю, что это не должно быть, потому что без yield/Promise() Я получаю правильные данные.

Возможно, Promise не требуется, но из того, что я читаю, кажется, что это может быть. Что я делаю не так?

Кстати, я уверен, выполнение так:

./node --harmony /myfile.js 
+0

Вы используете ** ECMA-6 ** - браузер с поддержкой браузера (или платформу, отличную от браузера)? –

+0

Я забыл добавить тег 'node', поэтому, чтобы ответить на ваш вопрос, я использую Node.js –

+0

' var rows = conn.query ("select * from groups"); '- вы не имеете в виду' doQuery' или 'query2'? выглядит как опечатка. –

ответ

0

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

+0

Как вернуть результат в' export.query() '? –

+0

Значение не может использоваться в 'export.query', если используется' Promise'. Тем не менее, вы можете использовать значение в обратном вызове, поставляемом в 'Promise.prototype.then'. Например, 'Promise.resolve (42) .then ((val) => val * 2)' создаст Promise, разрешенную со значением 42, а затем создаст новое Promise, разрешенное со значением 84. Вы можете связать несколько обратных вызовов с ' Promise.prototype.then' и 'Promise.prototype.catch', но вы не можете получить значение из' Promise' (насколько я знаю). – ileri

Смежные вопросы