2016-10-10 4 views
3

Я использую библиотеку обещаний bluebird и пытаюсь извлечь данные из MongoDb, проблема в том, что функция выполняет обещание, прежде чем я получу данные из db. вот мой код для извлечения данных.prom.veolve()

function getCollection(collectionName) { 

var p = database.listCollections().toArray(function(err, collInfos) { 

    if (err) return null; 

    for (var i = 0; i <= collInfos.length; i++) { 
    console.log('getdata'); 
    if (collInfos[i].name === collectionName) { 
     return collInfos[i]; 
    } 

    if (i === collInfos.length - 1) { 
     return null; 
    } 
    } 

}); 

p = Promise.resolve(p).bind(p).then(function collection(res) { 
    console.log(res,'res'); 
    return res; 
}); 

return p; } 

Когда этот код выполняется я получаю Undefine с «Рез» и «GetData» принтами впоследствии.

+2

Это означает, что 'toArray' не возвращает обещание,' p' является неопределенным и 'Promise.resolve' не знает, что ждать. – Bergi

+0

@ Bergi так как я могу вернуть обещание от 'toArray' с моим фактическим ответом i.e null или объект коллекции? –

+2

[** 'toArray()' **] (http://mongodb.github.io/node-mongodb-native/2.2/api/Cursor.html#toArray) возвращает Promise, если нет обратного вызова. – chridam

ответ

1

Методы MongoDB возвращают обещания , если вы не проходите обратный вызов. Поскольку вы прошли один, p стал undefined и Promise.resolve не знал, чего ждать. Вместо этого используйте

function getCollection(collectionName) { 
    return Promise.resolve(database.listCollections().toArray()) 
    .then(function(collInfos) { 
    for (var i = 0; i <= collInfos.length; i++) { 
     console.log('getdata'); 
     if (collInfos[i].name === collectionName) { 
     return collInfos[i]; 
     } 
    } 
    return null; 
    }, function(err) { 
    return null; 
    }) 
    .then(function collection(res) { 
    console.log(res,'res'); 
    return res; 
    }); 
}