2017-05-19 59 views
2

未啓動流星方法回調我正在使用Meteor。正如你可以在Github上的ValidatedMethod的README中看到的,它在調用一個方法時使用了returnStubValue選項,但它似乎不適用於我。我想知道你對此有何看法。客戶端模擬後使用ValidatedMethod

我已經上傳了重現Github上該問題的簡單流星項目:Link to the repository

這裏是我的服務器端方法:

export const createTodo = new ValidatedMethod({ 
    name: 'todos.create', 
    validate: new SimpleSchema({ 
    todo: String, 
    }).validator(), 
    run({ todo }) { 

    if (this.isSimulation) { 
     return { finished: false }; 
    } 

    Todos.insert({ todo }); 
    return { finished: true }; 
    }, 
}); 

這是在插入待完成的簡單方法託託斯收藏。在客戶端,我立即返回一個對象{ finished: false }。在服務器端更新我的數據庫,然後返回一個對象{ finished: true }

這裏是我的客戶端的方法調用:

createTodo.call({ todo }, (err, res) => { 
    console.log(res); 
}); 

我只是調用的方法和CONSOLE.LOG結果。 因爲我使用mdg:驗證方法,它使用returnStubValue選項,我猜我的控制檯應該輸出finished: false,然後finished: true。但它實際上只輸出finished: true

有什麼我不明白的嗎?

+0

你想完成什麼?檢查'this.isSimulation'是否是沒有意義的,因爲你的方法的全部_is_模擬。 –

+0

我想指出何時寫入服務器正在進行中,使用與Meteor指南中所示完全相同的方式:[just here](https://guide.meteor.com/ui-ux.html#writes-進行中)。 我的方法體是運行服務器和客戶端,實現[樂觀用戶界面](https://guide.meteor.com/ui-ux。html#optimistic-ui) –

回答

0

mdg:validated-method沒有問題。如果您在不引入validated-method的情況下調用(實際上是Meteor.apply)常規流星法,則會觀察到相同的結果。

這是事情。在流星的documentation

的方法的模擬返回值被丟棄,除非調用該方法時,在這種情況下, 是返回的方法調用者的 returnStubValue選項傳遞。 ValidatedMethod默認通過這個 選項。

注意大膽。在您的示例項目中,來自仿真的返回對象{ finished: false }是該調用的返回值,而不是回調。因此,如何使客戶端調用下面的轉型

const ret = createTodo.call({ todo }, (err, res) => { 
    console.log('res', res); 
}); 
console.log('ret', ret); 

將打印到控制檯

ret, {finished, false} 
res, {finished, true} 

。通過不等待服務器結果,UI變得樂觀。行爲總是有意義的,不是嗎?

不錯的問題!

+0

你是對的,真棒我終於明白了!謝謝。 –