2016-09-17 64 views
0

我正在使用jquery數據表和我的一列,我正在改變用戶基於默認數據看到的值。例如如何在沒有承諾的情況下從pouchdb獲取對象?

..., 
columns: [ 
    { "title": 'Category', render: function (data, type, row) {return db.categoryName(data);}} 
], 
... 

然後在我的功能我用id來獲取pouchdb對象,並返回找到的對象名稱

categoryName(id) { 
    return dbQuery.doc(id).then((arg) => { 
     console.log("the category name", arg.name); 
     return arg.name; 
    }); 
    } 

我得到正確的輸出到控制檯,但視圖顯示[object Promise]給每個文檔。當我只是想以我沒有承諾的方式返回一個價值時,我承諾很難承諾。

我該如何從promise中返回一個值,以便我可以使用我的categoryName函數?還是有另一種方法來從pouchdb中獲取值而不使用promise,這樣我可以讓我的categoryName函數返回一個值而不是promise對象?

回答

1

獲取操作是異步的,這就是爲什麼你只能返回一個承諾。

你唯一的其他選擇是傳遞一個回調:

categoryName(id, cb) { 
    dbQuery.doc(id).then((arg) => { 
    console.log("the category name", arg.name); 
    cb(arg.name); 
    }); 
} 
1

PouchDB API docs說:

PouchDB具有異步API

所以這是不可能的立即返回價值,因爲它不是立即可用,但是,您可以要求通知w母雞的值是通過傳遞一個回調方法

function categoryNameWithCallback(id, cb) { 
    // TODO: handle error 
    // Note that this method returns undefined 
    db.doc(id, (err, doc) => cb(doc.name)) 
} 

,或者使用承諾

function categoryName(id) { 
    return db.doc(id).then(doc => doc.name) 
} 

你應該閱讀真棒設計筆記kriskowals/q promise library瞭解的缺點一點點得到通知準備通過與使用承諾


現在回到你的問題簡單的回調,你可以重構你的代碼如下

function render(name) { 
    $('#example').DataTable({ 
    columns: [ 
    { "title": 'Category', render: function (data, type, row) { 
     // `name` will be available after the promise is resolved but not immediately 
     if (name) return name 
     // perform the async operation now and rerender the table when the value is available 
     categoryName(data).then(render) 
     // render with the default value first 
     return data; 
    }} 
    ] 
    }) 
} 

render() 
相關問題