gpt4 book ai didi

javascript - Node.JS - promise 不等待解决

转载 作者:行者123 更新时间:2023-11-30 07:01:55 24 4
gpt4 key购买 nike

我正在使用 dockerode 从 node.js 操作 docker。它自己的库不是问题,但我对 PROMISE 有疑问。看来 promise 不用等解决了。

下面的代码我预计输出将是:

Start
Middle // (or Err if docker does not running)
End

但是我收到了:

Start
End
Middle

看来promise是不是等着继续javascript的运行流程了。我做错了什么?

const Docker = require('dockerode')
let docker = new Docker();

console.log('Start');
let promise = new Promise(function (resolve, reject) {
docker.listContainers({all: true}, function (err, data) {
if (err) {
reject(err)
} else {
resolve(data);
}
});
});

promise.then(function (data) {
console.log('Middle');
}, function (err) {
console.log('Err');
});

console.log('End');

将此代码复制并粘贴到 https://npm.runkit.com/dockerode 或在此处查看结果:https://runkit.com/embed/y3wvg6ktecb9

最佳答案

你的输出是正确的,你误解了 promise 的工作方式。

promise 是 asynchronous ,它们在 different (microtask) tick 上运行在 event loop 中的同一任务中.这意味着当一段同步代码正在运行时,不会解决任何 promise 。

// output 'a', 'c', 'b'
console.log('a');
Promise.resolve().then(() => console.log('b'));
console.log('c');

此外,即使 promises 是同步的,对 docker.listContainers 的调用也是异步的,并且会在操作成功时收到回调以调用。

如果你想等待一个 promise ,要么把你想在 promise 得到解决后运行的代码放在那个 promise 的 then 回调中:

// output 'a', 'b', 'c'
console.log('a');
Promise.resolve()
.then(() => console.log('b'))
.then(() => console.log('c'));

或者将您的代码包装在 async function 中和 await promise :

// output 'a', 'b', 'c'
(async () => {
console.log('a');
await Promise.resolve().then(() => console.log('b'))
console.log('c');
})()

关于javascript - Node.JS - promise 不等待解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com