2016-08-02 96 views
-3

我有一個(異步)功能,可以在Chrome中獲取登錄用戶的ID。我試圖用回調函數返回ID的值,但是它一直返回'undefined'。回調無法正常工作 - Javascript

之前有人試圖以紀念這一個重複的,我使用的代碼從這裏(和嘗試過其他地方也是如此):How to return value from an asynchronous callback function?但它沒有工作:

function getGaia(callback) { 
    chrome.identity.getProfileUserInfo(function(userInfo){ 
     var userId = userInfo.id; 
     callback(userInfo.id); 
    }); 
} 

getGaia(function(id){ 
    return id; 
}); 

var gaiaId = getGaia(); 

我得到以下錯誤:

'callback' is a not a function 

我究竟在做什麼錯誤/什麼是正確的代碼?

+0

您確定使用'callback'或'Callback'嗎?該錯誤表示您正在使用「回撥」。但是你的代碼有小寫回調。 – zero298

+0

錯誤,'回調'是不是一個函數,在這裏C是回調的資本 –

+0

已編輯 - 這是一個錯字 – JamesJameson2456

回答

2

那是因爲你沒有提供回調。

function doSomethingLater(callback) { 
 
    setTimeout(callback, 1000); 
 
} 
 

 
console.log('This is before the callback'); 
 
doSomethingLater(function() { 
 
    console.log('This is the callback') 
 
});

所以,當你調用var gaiaId = getGaia();你是不是傳遞一個回調函數

[編輯]這是你的代碼需要什麼樣子:

function getGaia(callback) { 
    chrome.identity.getProfileUserInfo(function(userInfo){ 
     var userId = userInfo.id; 

     // This will call the function that you pass in below 
     //and pass in userInfo.if as a parameter 
     callback(userInfo.id); 
    }); 
} 

var gaiaId = getGaia(function (id) { 
    // id === userInfo.id from above 
    // Do something with the id that you pass in 
}); 

你可以想像JavaScript中的變量這樣的函數,

所以,你可以指定一個函數來像這樣的變量:

var foo = function() { ... }

這意味着你可以傳遞到像正常變量函數這一點。當你傳遞給函數作爲一個參數,要指定您在參數中指定的函數名稱:

var foo = function() { ... } 

function hasCallback(callback) { 
    // The following two line do exactly the same thing: 
    callback(); // Using the function that you passed in 
    foo(); // Using the function directly 
} 

hasCallback(foo); 

所有我在上面做,而不是創建變量foo我剛剛創建的功能內聯:

var foo = function() { ... } 

function hasCallback(callback) { 
    // The following two line do exactly the same thing: 
    callback(); // Using the function that you passed in 
    foo(); // Using the function directly 
} 

hasCallback(foo); 

// Becomes: 

function hasCallback(callback) { 
    callback(); // Using the function that you passed in 
} 

hasCallback(function() { ... }); 
+0

那麼我的代碼應該是什麼樣子? – JamesJameson2456

+0

基本上,您必須設置任何變量並處理回調中與'Gaia'' ID'相關的所有邏輯。 – Seth

+0

@ JamesJameson2456查看編輯 –