在使用asyc / wait执行同步代码时,如何“同步化”第三方代码?

时间:2018-07-23 15:46:55

标签: javascript node.js asynchronous es6-promise

我有一个用JS编写的批处理脚本,在Node下执行。

这是一个非常线性的,逻辑上同步的批处理脚本-A事情必须在B事情之前发生,等等。这件事需要从上到下执行,最好逐行同步执行。

(性能在这里不是很重要。最坏的情况下,执行时间为30秒。此外,在代码阻塞时没有UI可以锁定。这只能从命令行批量运行,而我可能会每次都看着它执行。)

我一直在尝试各种选择:

  • “异步” npm模块
  • 写我自己的承诺
  • 使用asyncawait

从可理解性的角度来看,我真的很喜欢最后一个。坦白地说,它将JavaScript降级为简单的线性执行,这正是我想要的。

go()

async function go() {
  await doThingOne()
  await doThingTwo()
}

但是,有时我的方法中包含来自第三方模块的代码,并且这些代码是异步的,没有同步选项。

考虑:

go()

async function go() {
  await doThingOne()
  await doThingTwo()
}

function doThingOne() {
  // do some things here
  doAsyncThingFromExternalLibrary()
  // do some more things here
}

我如何await进行第三方呼叫?它是异步编写的,没有同步选项,也不是我想要更改的代码。

是否有一种方法可以“包装”该调用,以便代码停止并等待它?我应该将其包装在自己的Promise中并制成thenable吗?

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

采用相同的方式编写自己的代码。

(async function() {

    await doThingOne();
    await doThingTwo();

    const result = await new Promise((resolve, reject) => {
        doAsyncThingFromExternalLibrary(function(err, result) {
            if (err) return reject(err);
            resolve(result);
        });
    });

})();

function doThingOne() {
    return Promise.resolve();
}

function doThingTwo() {
    return Promise.resolve();
}

function doAsyncThingFromExternalLibrary(fn) {
    setTimeout(fn, 1000);
}

答案 1 :(得分:1)

  

是否有一种方法可以“包装”该调用,以便代码停止并等待它?我应该将其包装在自己的Promise中并使其适用吗?

是的。

await将等待一个Promise,因此,如果您有一个想要await的功能,则需要它来返回Promise。