return 承诺的价值
return value of promise
我是 promise 的新手,我正在尝试 return 像 mongoose 那样的 promise 的价值,但使用的是 mongoskin 和 bluebird。这适用于猫鼬 return User.find().then(users => users)
。这将 return 一个用户列表,而不是 apollo-server 解析器中的承诺。
我试过 promise generator 和 async 但没有成功。从我读到的内容来看,承诺总是 return 是承诺,所以不知道 mongoose 如何 returning 一个值。
mongodb.js
import Promise from 'bluebird';
import mongoskin from 'mongoskin';
Object.keys(mongoskin).forEach(function (key) {
var value = mongoskin[key];
if (typeof value === 'function') {
Promise.promisifyAll(value);
Promise.promisifyAll(value.prototype);
}
});
Promise.promisifyAll(mongoskin);
export default {
connect (uri) {
return mongoskin.db(uri, {native_parser:true});
}
};
users.js
import mongodb from '../../databases/mongodb';
export default class User {
constructor () {
this.db = mongodb.connect('mongodb://127.0.0.1:27017/test', {native_parser:true});
this.collection = this.db.collection('users');
}
find (query = {}, options = {}) {
const findAsync = () => {
return Promise.resolve().then(() => {
return this.collection.findAsync(query, options);
})
.then((xx) => {
xx.toArray((err, items) => {
if (err) return err;
return items;
});
});
};
async function getData () {
let foo = await findAsync();
return foo;
}
return getData();
}
}
const user = new User();
function bar () {
return user.find().then(x => console.log(x));
}
console.log(bar());
您的代码似乎过于复杂。我想你想要的是这个(我没有承诺 mongoskin
因为它不太适合那个;见下文):
export default class User {
constructor() {
this.db = mongoskin.connect(...);
this.collection = this.db.collection('users');
}
find (query = {}, options = {}) {
return new Promise((resolve, reject) => {
this.collection.find(query, options).toArray((err, items) => {
if (err) return reject(err);
resolve(items);
});
});
}
}
我不得不说 Mongoskin 感觉已经过时了。它是官方 mongodb
驱动程序之上的皮肤,现在相当不错(它支持开箱即用的承诺,其中之一是 Mongoskin 不传播的东西)。
如果你确实想要 promisify,那么我应该说下面是一个 promise 反模式:
return Promise.resolve().then(() => {
return this.collection.findAsync(query, options);
}).then(...)
你可以改写成这样:
return this.collection.findAsync(query, options).then(...);
然而,toArray()
又让事情变得困难了,因为为此你 do 需要创建一个新的承诺,所以代码变成这样:
return this.collection.findAsync(query, options).then((cursor) => {
return new Promise((resolve, reject) => {
cursor.toArray((err, items) => {
if (err) return reject(err);
resolve(items);
});
});
});
它看起来一点也不漂亮,因此在这种情况下我选择不承诺并只使用回调(尽管我确信 Bluebird 有一些不错的工具可以使上面的代码更容易看,但仍然...)。
我是 promise 的新手,我正在尝试 return 像 mongoose 那样的 promise 的价值,但使用的是 mongoskin 和 bluebird。这适用于猫鼬 return User.find().then(users => users)
。这将 return 一个用户列表,而不是 apollo-server 解析器中的承诺。
我试过 promise generator 和 async 但没有成功。从我读到的内容来看,承诺总是 return 是承诺,所以不知道 mongoose 如何 returning 一个值。
mongodb.js
import Promise from 'bluebird';
import mongoskin from 'mongoskin';
Object.keys(mongoskin).forEach(function (key) {
var value = mongoskin[key];
if (typeof value === 'function') {
Promise.promisifyAll(value);
Promise.promisifyAll(value.prototype);
}
});
Promise.promisifyAll(mongoskin);
export default {
connect (uri) {
return mongoskin.db(uri, {native_parser:true});
}
};
users.js
import mongodb from '../../databases/mongodb';
export default class User {
constructor () {
this.db = mongodb.connect('mongodb://127.0.0.1:27017/test', {native_parser:true});
this.collection = this.db.collection('users');
}
find (query = {}, options = {}) {
const findAsync = () => {
return Promise.resolve().then(() => {
return this.collection.findAsync(query, options);
})
.then((xx) => {
xx.toArray((err, items) => {
if (err) return err;
return items;
});
});
};
async function getData () {
let foo = await findAsync();
return foo;
}
return getData();
}
}
const user = new User();
function bar () {
return user.find().then(x => console.log(x));
}
console.log(bar());
您的代码似乎过于复杂。我想你想要的是这个(我没有承诺 mongoskin
因为它不太适合那个;见下文):
export default class User {
constructor() {
this.db = mongoskin.connect(...);
this.collection = this.db.collection('users');
}
find (query = {}, options = {}) {
return new Promise((resolve, reject) => {
this.collection.find(query, options).toArray((err, items) => {
if (err) return reject(err);
resolve(items);
});
});
}
}
我不得不说 Mongoskin 感觉已经过时了。它是官方 mongodb
驱动程序之上的皮肤,现在相当不错(它支持开箱即用的承诺,其中之一是 Mongoskin 不传播的东西)。
如果你确实想要 promisify,那么我应该说下面是一个 promise 反模式:
return Promise.resolve().then(() => {
return this.collection.findAsync(query, options);
}).then(...)
你可以改写成这样:
return this.collection.findAsync(query, options).then(...);
然而,toArray()
又让事情变得困难了,因为为此你 do 需要创建一个新的承诺,所以代码变成这样:
return this.collection.findAsync(query, options).then((cursor) => {
return new Promise((resolve, reject) => {
cursor.toArray((err, items) => {
if (err) return reject(err);
resolve(items);
});
});
});
它看起来一点也不漂亮,因此在这种情况下我选择不承诺并只使用回调(尽管我确信 Bluebird 有一些不错的工具可以使上面的代码更容易看,但仍然...)。