2017-05-02 5 views
0

getURL gibt ein Zusicherungsobjekt zurück, warum funktioniert es nicht?getURL gibt kein Zusicherungsobjekt zurück

const fs = require('fs'); 

function getURL(URL){ 
    fs.readFile(URL,(err, buffer)=>{ 
     if(err) return Promise.reject(err.message); 
     return Promise.resolve(buffer.toString()); 
    }); 
    // return Promise.resolve(42); works 
} 
getURL('1.txt').then(text=>{ 
    console.log(text); 
}).catch(err=>{ 
    console.log(err); 
}); 

Danke. Kann ich die statische Methode Promise.resolve verwenden, um ein neues Promise-Objekt zurückzugeben?

+0

Ihre 'getURL()' Funktion gibt nichts zurück. – Pointy

+0

Es ist nicht sinnvoll, von einer Rückruffunktion aus zurückzukehren. –

+0

@NidhinDavid Also ist das Problem asynchrone Operation? – wolfrevo

Antwort

1

Sie können nicht return a value from an asynchronous callback.

Stattdessen müssen Sie das Versprechen in der äußeren Funktion (mit new Promise) erstellen und Ihre asynchronen Code innerhalb der Vollstrecker dieses Versprechen laufen:

function getURL(URL) { 
    return new Promise((resolve, reject) => { 
    // run asynchronous code here 
    // call resolve on success or reject on error 

    fs.readFile(URL, (err, buffer) => { 
     if(err) 
     reject(err); 
     else 
     resolve(buffer.toString()); 
    }); 
    } 
} 

That being said, ist es als beste um zu vermeiden, selbst Versprechungen zu erstellen, wann immer Sie können (wie aaaaaa hingewiesen, es ist ein promise antipattern). Im speziellen Fall von fs (und anderen integrierten in Node-Module) Ich würde empfehlen, dass Sie stattdessen so etwas wie mz verwenden, die alle integrierten Module wickelt und sie verspricht statt Rückrufe verwenden macht:

const fs = require('mz/fs'); 
function getURL(URL) { 
    return fs.readFile(URL) 
    .then((buffer) => buffer.toString()); 
} 

// or even better: 
function getURL(URL) { 
    return fs.readFile(URL, 'utf8'); 
} 
Verwandte Themen