2017-08-09 49 views
1

我想創建一個函數,當我打電話給它,我可以給一個性別,它會返回給我一個隨機的名字。問題是我希望它是可重用的,這是我遇到困難的地方。試圖使可重用的javascript功能,但數據不返回

var Name = ''; 
var Gender = ''; 

var NameChild1(){ 
    var Child1Gender = 'Male' 
    Child1Name = NameFunction(Child1Gender, Child1Name) 
} 

function NameFunction(Gender, Name) { 
    var NameChance1 = Math.floor(Math.random() * 10) + 1; 
    NameChance1 = NameChance1.toString(); 
    d3.csv('Names.csv', function(NameData) { 
    var NameFilter = NameData.filter(function(d) { 
     return (d.Rank == NameChance1) 
    }) 
    if (Gender == 'Female') { 
     Name = NameFilter[0]['NameFemale']; 
     return (Name); 
    } else if (Gender == 'Male') { 
     return (Name); 
    }; 
    }); 
}; 

名稱過濾器在if語句中工作,如果我在它們內部執行console.log - 但它不會回過頭來。

有誰知道問題是什麼?

此外,這是CSV,如果有幫助!

Rank,NameMale,NameFemale 
1,Oliver ,Amelia 
2,Jack ,Olivia 
3,Harry ,Emily 
4,George ,Isla 
5,Jacob ,Ava 
6,Charlie ,Ella 
7,Noah ,Jessica 
8,William ,Isabella 
9,Thomas ,Mia 
10,Oscar ,Poppy 

回答

1

這個函數將返回undefined。

function NameFunction(Gender, Name) { 
    var NameChance1 = Math.floor(Math.random() * 10) + 1; 
    NameChance1 = NameChance1.toString(); 
    d3.csv('Names.csv', function(NameData) { 
    var NameFilter = NameData.filter(function(d) { 
     return (d.Rank == NameChance1) 
    }) 
    if (Gender == 'Female') { 
     Name = NameFilter[0]['NameFemale']; 
     return (Name); 
    } else if (Gender == 'Male') { 
     return (Name); 
    }; 
    }); 
}; 

原因d3.csv('Names.csv')是異步的。

所以,你可以做這樣的事情:

var Name = ''; 
var Gender = ''; 
function NameFunction(Gender, Name, NameData) { 
    var NameChance1 = Math.floor(Math.random() * 10) + 1; 
    NameChance1 = NameChance1.toString(); 
    var NameFilter = NameData.filter(function(d) { 
     return (d.Rank == NameChance1) 
    }) 
    if (Gender == 'Female') { 
     Name = NameFilter[0]['NameFemale']; 
     return (Name); 
    } else if (Gender == 'Male') { 
     Name = NameFilter[0]['NameMale']; 
     return (Name); 
    }; 
    }); 
}; 
var NameChild1 = function(NameData){ 
    var Child1Gender = 'Male' 
    Child1Name = NameFunction(Child1Gender, Child1Name, NameData) 
    //you can do stuff with Child1Name 
} 
function loadMyCSV(){ 
    return d3.csv('Names.csv', function(NameData) { 
    NameChild1(NameData); 
    } 
} 
loadMyCSV(); 

在堅果殼:

1,您首先調用loadMyCSV()

1.1。 loadMyCSV的成功將會調用NameChild1並將完整的解析數據傳遞給該函數。

1.2。 NameChild1將調用NameFunction,它將獲得Child1Name。

希望這會有所幫助!

+0

工作很好,謝謝!我必須重複使用名稱函數幾次 - 當我調用loadMyCSV()時,是否有任何方法可以使{NameChild1(NameData);}行成爲行;所以我可以寫loadMyCSV(NameChild1);或者其他的東西? – Jess

+0

不清楚你想達到什麼...你能解釋一下嗎 – Cyril

1
var Name = ''; 
var Gender = ''; 

var NameChild1(){ 
    var Child1Gender = 'Male' 
    Child1Name = NameFunction(Child1Gender); 
    return Child1Name; 
} 

function NameFunction(Gender) { 
    var Name; 
    var NameChance1 = Math.floor(Math.random() * 10) + 1; 
    NameChance1 = NameChance1.toString(); 
    d3.csv('Names.csv', function(NameData) { 
    var NameFilter = NameData.filter(function(d) { 
     return (d.Rank.toString() == NameChance1) 
    }) 
    if (Gender == 'Female') { 
     Name = NameFilter[0]['NameFemale']; 
     return (Name); 
    } else if (Gender == 'Male') { 
     Name = NameFilter[0]['NameMale']; 
     return (Name); 
    }; 
    }); 
};