2017-07-28 24 views
1

這是具有2個功能的文件「path-info.js」:pathInfo &回調。 Pathinfo收集關於來自對象「info」中路徑的文件的所有信息,回調獲取該對象並將其返回。代碼:我的回撥有什麼問題?

"use strict"; 
const fs = require("fs"); 

let getInfo = function (err, someObject) { 
    if (err) throw err; 
    return someObject; 
}; 

function pathInfo(path, callback) { 
    let info = {}; 

    info.path = path; // write path info 

    fs.stat(path, (err, type) => { // write type info 
    if (type.isFile()) { 
     info.type = "file"; 
    } 
    if (type.isDirectory()) { 
     info.type = "directory"; 
    } else { 
     info.type = "undefined"; 
    } 
    }); 

    fs.stat(path, (err, type) => { // write content info if it is file 
    if (type.isFile()) { 
     fs.readFile(path, "utf8", (err, content) => { 
     info.content = content; 
     }); 
    } else { 
     info.content = "undefined"; 
    } 
    }); 

    fs.stat(path, (err, type) => { // write childs if it is directory 
    if (type.isDirectory()) { 
     fs.readdir(path, (err, childs) => { 
     info.childs = childs 
     }); 
    } else { 
     info.childs = "undefined"; 
    } 
    }); 

    getInfo(null, info); // callback returns object "info" 
} 

module.exports = pathInfo; 

我用我的回調函數,因爲它顯示出,例如,在這裏:nodeJs callbacks simple example。儘管如此,這段代碼不起作用,我不知道爲什麼。

我打電話使用文件「test.js」這段代碼,這裏是代碼:

const pathInfo = require('./path-info'); 
function showInfo(err, info) { 
    if (err) { 
    console.log('Error occurred'); 
    return; 
    } 

    switch (info.type) { 
    case 'file': 
     console.log(`${info.path} — is File, contents:`); 
     console.log(info.content); 
     console.log('-'.repeat(10)); 
     break; 
    case 'directory': 
     console.log(`${info.path} — is Directory, child files:`); 
     info.childs.forEach(name => console.log(` ${name}`)); 
     console.log('-'.repeat(10)); 
     break; 
    default: 
     console.log('Is not supported'); 
     break; 
    } 
} 

pathInfo(__dirname, showInfo); 
pathInfo(__filename, showInfo); 

所以邏輯是,我需要給我的回調,其中包含有關目錄或文件的一些信息的對象。根據不同的情況,會顯示一些console.log。

任何幫助將不勝感激!

UPD:更新了代碼,只是將我的「回調」函數重命名爲「getInfo」。

+0

定義「不工作' –

+0

這是因爲你在你的'path-info.js'中聲明瞭一個名爲'callback'的變量,重命名它並且它將解決你的問題 –

+0

你得到了什麼錯誤信息? –

回答

0

如果有人有興趣。我找到了解決辦法和它的作品!正如@ ADreNaLiNe-DJ正確指出的,當我調用getInfo回調來返回信息對象時,我的回調沒有完成。所以出路在於改變我的抽象層次:我所做的一切都是將我的回調粘貼到函數中。看到代碼:

"use strict"; 
const fs = require("fs"); 

let pathInfo = (path, callback) => { 
    let info = {}; 
    info.path = path; 

    fs.stat(path, (err, type) => { 
    if (err) throw err; 
    if (type.isFile()) { 
     info.type = "file"; 
     fs.readFile(path, "utf8", (err, content) => { 
     info.content = content; 
     info.childs = undefined; 
     callback(err, info); 
     }); 
    } 
    if (type.isDirectory()) { 
     info.type = "directory"; 
     fs.readdir(path, (err, childs) => { 
     info.childs = childs; 
     info.content = undefined; 
     callback(err, info); 
     }); 
    } 
    }); 
}; 

let showInfo = (err, info) => {  // Отсюда и ниже вставлен код из текста 
    if (err) {      // из домашнего задания 
    console.log('Возникла ошибка при получении информации'); 
    return; 
    } 

    switch (info.type) { 
    case 'file': 
     console.log(`${info.path} — является файлом, содержимое:`); 
     console.log(info.content); 
     console.log('-'.repeat(10)); 
     break; 
    case 'directory': 
     console.log(`${info.path} — является папкой, список файлов и папок в ней:`); 
     info.childs.forEach(name => console.log(` ${name}`)); 
     console.log('-'.repeat(10)); 
     break; 
    default: 
     console.log('Данный тип узла не поддерживается'); 
     break; 
    } 
}; 

pathInfo(__dirname, showInfo); 
pathInfo(__filename, showInfo); 

PS:對不起,俄羅斯console.logs,希望不會打擾你(他們不帶來任何價值反正到理解它是如何工作)

0

A 回調是您作爲參數傳遞給另一個函數的函數。

在你的情況下,你的第二個參數是功能showInfo這是你的回調。您的功能pathInfo接受兩個參數,第二個是showInfo

所以當你調用它時,你需要執行showInfo中的代碼,並帶有一些參數,通常是err,然後是其他參數。

在你的情況,你的名字第二個參數「回調」在showInfo,所以你有問參數(ERR和信息)來執行它。

實施例:

function myfunc (parameter,cb) { 
    cb(null,{}); 
} 

myfunc("one", function (err,res) { 
    console.log(err); 
}); 

在 「MYFUNC」,其中 「CB」 功能被髮送作爲第二個參數。

可以這樣寫,你做到了:

var cb = function (err,res) { 
    console.log(err); 
} 

myfunc("one",cb);