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