我有一个用JS编写的批处理脚本,在Node下执行。
这是一个非常线性的,逻辑上同步的批处理脚本-A事情必须在B事情之前发生,等等。这件事需要从上到下执行,最好逐行同步执行。
(性能在这里不是很重要。最坏的情况下,执行时间为30秒。此外,在代码阻塞时没有UI可以锁定。这只能从命令行批量运行,而我可能会每次都看着它执行。)
我一直在尝试各种选择:
async
和await
从可理解性的角度来看,我真的很喜欢最后一个。坦白地说,它将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
吗?
最好的方法是什么?
答案 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。