Javascript 当使用asyc/wait等待同步代码执行时,如何;“同步通知”;第三方代码?

Javascript 当使用asyc/wait等待同步代码执行时,如何;“同步通知”;第三方代码?,javascript,node.js,asynchronous,es6-promise,Javascript,Node.js,Asynchronous,Es6 Promise,我有一个用JS编写的批处理脚本,在Node下执行 这是一个非常线性的、逻辑上同步的批处理脚本——事情a必须发生在事情B之前,等等。这件事情需要从上到下同步执行,最好是逐行执行 (性能在这里并不重要。最坏的情况是执行时间为30秒。此外,代码阻塞时没有要锁定的UI。这将只能从命令行批量运行,我可能每次都会看到它的执行。) 我一直在研究各种选择: “异步”npm模块 写下我自己的承诺 使用async和wait 从可理解的角度来看,我真的很喜欢最后一个。它将JavaScript“降级”为简单的线性执

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

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

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

我一直在研究各种选择:

  • “异步”npm模块
  • 写下我自己的承诺
  • 使用
    async
    wait
从可理解的角度来看,我真的很喜欢最后一个。它将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
}
我如何等待第三方呼叫?它是异步编写的,没有同步选项,并且不是我想要更改的代码

是否有一种方法可以“包装”该调用,使代码停止并等待它?我是否应该用我自己的
承诺
包装它,并使之成为一个
表格


最好的方法是什么?

与处理自己的代码的方法相同

(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);
}
是否有一种方法可以“包装”该调用,使代码停止并等待它?我应该把它写进我自己的承诺里,让它成为现实吗


await
将等待一个承诺,因此如果您有一个函数想要
await
那么您需要它来返回一个承诺。

您将创建一个包装器方法,该方法返回一个承诺。如果它还没有返回承诺,如果外部函数返回一个承诺,你可以等待它。如果它没有(假设它使用典型的
回调(err,result)
模式),则将其包装在承诺中,例如:
等待新承诺((resolve,reject)=>{externalFunction(function(err,result){…resolve()…})假设
doAsyncThingFromExternalLibrary
返回一个承诺。是的,假设它返回。如果没有,那么就没有真正的方法了。@Baruch如果外部方法本身没有返回一个承诺,那么您可以返回一个已创建的承诺,即包装器可以成为承诺,但这并不保证函数在执行之前会等待
doAsyncThingFromExternalLibrary
完成。它确实会(a)等待承诺解决。这是否意味着,从广义上说,我的所有步骤都需要有自己的功能?功能是唯一可以“等待”的东西吗?@Deane-不。你只能等待承诺,不能等待功能。