首页 > 解决方案 > 节点替代 grunt 异步功能

问题描述

我正在尝试用一些普通的节点代码替换一些非常旧的 grunt 代码。

一些函数done = this.async()用来提供一个句柄,你可以用它来表示工作已经完成。

我将如何用节点代码替换它?

标签: node.jsgruntjs

解决方案


我认为您最好的方法可能是使用从 ES2017 / Node.js 7.6 开始可用的 async/await 功能。这不会像 done = this.async() 模式那样将异步函数转换为同步函数,但它允许看起来像异步的函数调用。

必须进行的一项修改是调用函数(在本例中为 testGetResult)必须标记为async

例如,假设您有这样的函数:

function getResult() {
    var done = this.async();
    asyncCall(function(result) {
        done(result);
    })
}

我们将替换为:

function getResult() {
    return new Promise(function(resolve, reject) {
        asyncCall(function(result)  {
            resolve(result);
        });
    })
}

/* Example of an asynchronous function called by someFunction. */
function asyncCall(callback) {
    setTimeout(callback, 1000, { status: 42 } );
}

async function testGetResult() {
    /* Make getResult _look_ like it is synchronous. */
    let result = await getResult();
    console.log('result: ', result);
}

testGetResult();

如果您要尝试保持当前使用的确切语法,我认为您必须编写一些非常时髦的代码来以某种方式阻止函数的执行(例如 getResult),直到调用 done() 函数。


推荐阅读