我的utils.js有两个功能。我在electron@2.0.2中使用。
async function detectMimeType(filePath) {
let detectMime=new Promise((resolve, reject) => {
// mmmagic npm module
magic.detectFile(filePath, function(err, result) {
if (err) reject(err);
resolve(result);
});
});
let result = await detectMime;
return result;
}
async function parseXML(data) {
let parse = new Promise((resolve, reject) => {
// xml2js npm module
parser.parseString(data,function(err,xmldata){
if (err) reject(err);
resolve(xmldata);
});
});
let result = await parse;
return result;
}
detectMimeType func返回结果。但 parseXML func返回Promise对象挂起。
let mime = detectMimeType('testingSound.mp3'); // returning 'audio/mpeg';
let xmlPayload =
parseXML('<root><test>testData</test></root>'); //returning Promise object pending
但它的工作原理如下。
async function init(){
let xmlPayload =
await parseXML('<root><test>testData</test></root>');
}
为什么它不像detectMimeType那样工作?
UPDATE: detectMimeType和parseXML两个func返回Promise Object。 异步函数总是返回一个Promise。
答案 0 :(得分:-1)
声明为async function
的函数总是返回promises,即使它们的主体是完全同步的:
async function foo() {
// seemingly synchronous code
return "bar!";
}
const a = foo(); // Promise<pending>
const b = await foo(); // "bar!"
无论从async
函数返回什么,都会传递给作为resolve()
调用结果创建的隐式承诺的reject()
或async function
函数
因此,您始终await foo()
表示结果,或者如果您被迫使用回调,则使用foo().then()
。
在一般情况下,return await promise
仅仅是一个自我记录的构造,实际上等同于return promise
,因为在任何情况下,承诺都将作为隐式返回承诺解决过程的一部分等待。
另外,根据您的意图,我建议您使用标准Node.js util.promisify
或Bluebird.promisify
(无论哪个可用)宣传您的功能:
const { promisify } = require('util');
const detectMimeType = promisify(magic.detectFile);
const parseXML = promisify(parser.parseString);
这使它们在功能上等同于你已经生成的代码,但过度使用new Promise()
的限制,通常不赞成。