1
我有一個函數createOne()
應該嘗試找到一個MongoDB的文檔或創建它,如果它不能被發現。在這兩種方式,一種承諾應返回,並承諾與doc
解決:承諾返回值和築巢
var createOne = function(category) {
var self = this;
return this.findOne({ slug: category.slug }).exec()
.then(function(doc) {
if (!doc) {
return self.create(category); // wait to resolve until document created.
}
});
};
兩個findOne().exec()
和create()
(應該)返回一個承諾。
我嘗試了很多不同的方式,例如使用Q.fcall,用Q.defer()和其他方法手動創建一個,但是解析值丟失,或者創建了第二個{ slug: 'foo' }
,即使第一個已經存在(?)。
以下是我調用代碼:
var data = [
{ slug: 'foo' },
{ slug: 'bar' },
{ slug: 'foo' } // <- shouldn't be created because of first 'foo'.
];
Q.fcall(function() {
// [...]
}).then(function() {
var promises = data.map(function(category) {
return createOne(category); // <- calls createOne().
});
return Q.all(promises);
}).then(function(categories) {
console.log(categories);
}).done();
我怎樣組織createOne()
使console.log(categories)
返回文檔,無論是發現還是第一次創建?
編輯:當集合爲空時,只應創建兩個文檔。 { slug: 'foo' }
只有一次。
應該不是''如果有一個返回'else'條款'doc'直接? – greim
a)那只是僞代碼還是你的'.exec()'調用已經返回一個promise(帶'.then()'方法)? b)貓鼬是如何發現沒有文件被發現的,它是錯誤還是通過'null'? – Bergi
是的,沒錯,謝謝!返回值現在確定:) 我認爲第二個'{slug:'foo'}'被創建是因爲我調用了我的'createOne()'rapid-fire樣式,而不是等待異步查找/創建調用完成。那可能嗎? –