如何使用异步等待包装回调?

Tia*_*olo 11 javascript node.js ecmascript-6 ecmascript-2017

我的函数解析了http服务器启动后立即解析的承诺.这是我的代码:

function start() {
    return new Promise((resolve, reject) {
        this.server = Http.createServer(app);
        this.server.listen(port, () => {
            resolve();
        });
    })
}
Run Code Online (Sandbox Code Playgroud)

如何将启动功能转换为异步/等待?

gue*_*314 8

包括async函数声明和之前awaitPromise构造.虽然请注意,您实际上是在为现有模式添加代码.await将值转换为a Promise,尽管Question的代码已经使用了Promise构造函数.

async function start() {
    let promise = await new Promise((resolve, reject) => {
        this.server = Http.createServer(app);
        this.server.listen(port, () => {
            resolve();
        });
    })
    .catch(err => {throw err});

    return promise
}

start()
.then(data => console.log(data))
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)

  • 您不能仅通过使用Promise或async / await来“摆脱回调” (3认同)
  • 如果你不在 Promise 中调用 `reject()`,`.catch(...)` 永远不会触发,看在上帝的份上,至少在 `this.server.on("error", ... )`。 (3认同)
  • 你只是包装了承诺。我想摆脱回调。 (2认同)
  • @TiagoBértoloasync意味着让promise链更像同步代码.它是糖,但非常有用的糖(for循环,while循环,if语句,try/catch现在可以使用promises) (2认同)

Jos*_*lik 6

创建new Promise类似其他答案的建议表明在这种情况下可以正常工作,但是作为一般规则,util.promisify可以阻止您多次编写相同的内容。

因此,您可以改为执行以下操作:(node.js v8.0.0 +)

const util = require('util');
async function start() {
    let server = Http.createServer(app);
    await util.promisify(server.listen.bind(server))(port);
}
Run Code Online (Sandbox Code Playgroud)

util.promisify(some_function) 接受一个通常接受回调的函数,并返回此函数的新包装版本,而该版本将返回Promise。

有更多解释的步骤:

let server = Http.createServer(app);
// .bind() is needed so that .listen() keeps the correct `this` context when it is called.
// If your function does not require any specific context, leave off .bind()
let listen_promise = util.promisify(server.listen.bind(server));
await listen_promise(port);
Run Code Online (Sandbox Code Playgroud)

蓝鸟可以进行更高级的传播。


Kej*_*ejt 5

使用:

const doRequest = () => new Promise((resolve, reject) {
    this.server = Http.createServer(app);
    this.server.listen(port, () => {
        resolve();
    });
})

async function start() {
    await doRequest()
}
Run Code Online (Sandbox Code Playgroud)

我相信,类似这样的事情。