2013-04-03 52 views
1

我想在我的mocha測試中保存兩個Mongoose對象,並在兩者都成功時收到通知。我正在使用asyncjs庫來實現此目的。使用asyncjs保存多個Mongoose對象不起作用

beforeEach (done) -> 

    obj1 = new Person({ name: 'Jon' }) 
    obj2 = new Person({ name: 'Dan' }) 

    console.log obj1 # ... { name: 'Jon', _id: 4534534543512 } 

    async.list([ 
    obj1.save 
    obj2.save 
    ]).call().end((err, res) -> 
    return done(err) if err 
    done() 
) 

你可以看到,OBJ1被設置爲在一個的console.log文件的MongoDB - 但是當我想用保存功能將它們持久化到數據庫,我在嘗試執行此,當出現以下錯誤:

TypeError: Cannot read property 'save' of undefined 

如果我是來取代在async.list兩個函數說

console.log 
console.log 

的代碼執行罰款......另外,如果我是爲了節省異步外的兩個對象.LIST功能如此

obj1.save() 
obj2.save() 

它也執行正常,沒有錯誤。

我很難過。

+1

另外值得注意的是,有兩個類似命名的異步庫:async和asyncjs。上面的例子來自asyncjs--但更好的庫是異步的,而使用那裏的方法是:parallel。 – Joerg 2013-04-05 06:46:04

回答

2

很可能是因爲save函數沒有被預期的上下文調用(this)。

當你傳遞一個「方法」像obj1.save,參考async.list()得到的是隻對function本身沒有任何鏈接返回到obj1(或obj2)。這將是類似於:

save = obj1.save 
save() # `this` is `undefined` or `global` 

要通過與固定的情況下,您可以bind他們:

​​3210

或使用的其他功能,因此它們被稱爲後member operator

async.list([ 
    (done) -> obj1.save(done), 
    (done) -> obj2.save(done) 
]) # etc. 
+0

這樣做的伎倆 - 謝謝 - 你結束了很多挫折。我懷疑圍繞_this_的事情 - 並且通過調用方法傳遞了這個 - 並且調用this.obj1.save(),這顯然不起作用。 – Joerg 2013-04-04 05:44:10