2015-07-06 144 views
9

我想學習回送,但我真的不明白'cb'在函數調用中的含義。我讀了In loopback documentation what does variable 'cb' stands for?,我對nodejs中的回調有基本的瞭解,但是我只是不瞭解loopback中的cb。 例如,http://docs.strongloop.com/display/public/LB/Remote+methods'cb'在回送中意味着什麼?

module.exports = function(Person){ 

    Person.greet = function(msg, cb) { 
     cb(null, 'Greetings... ' + msg); 
    } 

    Person.remoteMethod(
     'greet', 
     { 
      accepts: {arg: 'msg', type: 'string'}, 
      returns: {arg: 'greeting', type: 'string'} 
     } 
    ); 
}; 

那個cb是什麼意思?我們如何知道它接受兩個參數,即null和一個字符串?希望有人能幫助。

+0

calback功能? – user3227295

+1

'cb'代表回調,沒什麼特別的,只是可變名,可以用任何其他變量名代替 – mido

+1

它只是一個節點樣式的東西,在異步中,回調的第一個參數通常會拒絕錯誤對象(這是拋出,因爲它不能同步拋出)第二,第三...第n個參數是你期望從你調用的異步方法期望的值... – mido

回答

9

所以,你有一個異步功能Person.greet,你會打電話給這樣的:

Person.greet('hello', function(err){ 
    ... 
}); 

注意'hello'後第二個參數傳遞,它實際上是一個函數。它也可以用一個名字之外定義,並通過這種方式:

function callback(err){ 
    ... 
} 
Person.greet('hello', callback); 

現在看起來究竟是怎麼Person.greet定義:

Person.greet = function(msg, cb) { 
    cb(null, 'Greetings... ' + msg); 
} 

這裏的區別僅僅是在定義它使用不同的名字:cb。它可以使用任何名稱,因爲它cb只是一個參數。但通常使用「cb」,「done」或「next」作爲標準做法。

+0

好吧。我真的知道回調是什麼。混淆我的主要問題是他們定義回調的位置。不管怎樣,謝謝。 –

+0

@KenKwok他們沒有定義它,你這樣做。你將內聯函數作爲命名參數'cb'傳遞給他們,以便他們可以稱之爲 – laggingreflex

+0

但是看起來loopback不能用這種方式工作... –

0

我剛剛遇到同樣的問題,經過幾個小時的沮喪,我找到了官方的答案。

https://docs.strongloop.com/display/public/LB/Remote+methods#Remotemethods-Howtodefinearemotemethod

選項接受:

定義參數,該遠程方法接受。這些參數將 映射到您定義的靜態方法。對於上面的例子,你可以看到 函數簽名:Person.greet(姓名,年齡,回調)... name是 第一個參數,age是第二個參數和回調是 環回自動提供(不在您的 accepts陣列中指定它)。有關更多信息,請參閱參數說明。如果 未提供,則默認爲空數組[[]。

3

看看答案,在我看來,這兩個問題中只有1個得到回答。


問題1:cb是什麼意思?

這已被回答,它是回調函數的簡稱。


問題2:我們如何知道它接受兩個參數null和一個字符串?

你在你的遠程方法的返回選項,執行以下操作根據docs定義此:

介紹了遠程方法的回調參數;請參閱參數說明。假定err參數;不要指定。

因此,如果我們看一下你的例子

Person.remoteMethod(
    'greet', 
    { 
     accepts: {arg: 'msg', type: 'string'}, 
     returns: {arg: 'greeting', type: 'string'} 
    } 
); 

這裏,您定義的回調參數是

callback(err, greeting: string)

讓有從文檔又如:

MyModel.remoteMethod('download', { 
     isStatic: true, 
     returns: [ 
      { arg: 'body', type: 'file', root: true }, 
      { arg: 'Content-Type', type: 'string', http: { target: 'header' } }, 
     ], 
    }); 

在這個例子中,回調將是

callback(err, body: file, Content-Type: string)

和用法是這樣

cb(null, stream, 'application/octet-stream');