Javascript内部承诺回调

时间:2017-05-22 09:10:38

标签: javascript callback promise

我在将数据从mongoDB导出到javascript时遇到问题。所以,我使用mongoDB的promises,并且我使用.toArray()方法来检索数据。 我试图将数据传递给回调内的下一个.then()。

这是我的代码:

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var ObjectId = require('mongodb').ObjectID;
var url = 'mongodb://localhost:27017/website';

MongoClient.connect(url)
.then((db, err) => { assert.equal(null, err); return [db, err] })
.then(([db, err]) => {
    return [db.collection('goodsList'), db];
})
.then(([collection, db]) => {
    function toArr(collection) {
        var documents = collection.find({}).toArray( function(err, docs) {
            return docs;
        })
    }
    return [toArr(collection), db]
})
.then(([docs, db]) => {
    console.log(docs)
    console.log(db)
    db.close()
})
.catch ((err) => {throw err})

它返回undefined和' Db'宾语。我知道代码已被破坏,但我不知道如何修复它。

1 个答案:

答案 0 :(得分:0)

.toArray返回一个promise时,你需要重写你的代码以等待那个promise - 不需要.then中的那个函数,正如你在下面的代码中看到的那样

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var ObjectId = require('mongodb').ObjectID;
var url = 'mongodb://localhost:27017/website';

MongoClient.connect(url)
.then((db, err) => { 
    assert.equal(null, err); 
    return [db, err];
})
.then(([db, err]) => {
    return [db.collection('goodsList'), db];
})
.then(([collection, db]) => 
    // wait for .toArray to resolve then return [docs, db]
    collection.find({}).toArray()
    .then(docs => [docs, db])
)
.then(([docs, db]) => {
    console.log(docs)
    console.log(db)
    db.close()
});

代码中的最后一行

.catch ((err) => {throw err}) // no need for this

是多余的,它实际上完全不同于没有代码!