Javascript,两个异步/等待和承诺功能,但一个正在工作,另一个不工作

时间:2018-06-18 08:36:54

标签: javascript promise async-await

我的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。

1 个答案:

答案 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.promisifyBluebird.promisify(无论哪个可用)宣传您的功能:

const { promisify } = require('util');

const detectMimeType = promisify(magic.detectFile);
const parseXML = promisify(parser.parseString);

这使它们在功能上等同于你已经生成的代码,但过度使用new Promise()的限制,通常不赞成。