Joa*_*aes 1 javascript node.js promise
我正在使用dockerode来操作来自node.js 的docker.它自己的图书馆不是问题,但我有PROMISE的问题.似乎承诺不等待解决.
下面的代码我预计输出将是:
Start
Middle // (or Err if docker does not running)
End
Run Code Online (Sandbox Code Playgroud)
但我收到了:
Start
End
Middle
Run Code Online (Sandbox Code Playgroud)
似乎承诺不等待继续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');
Run Code Online (Sandbox Code Playgroud)
将此代码复制并粘贴到https://npm.runkit.com/dockerode或在此处查看结果:https://runkit.com/embed/y3wvg6ktecb9
nem*_*035 12
你的输出是正确的,你误解了承诺是如何工作的.
Promise是异步的,它们在事件循环中的同一任务中运行不同的(微任务)标记.这意味着在同步代码片段运行时不会解决任何承诺.
// output 'a', 'c', 'b'
console.log('a');
Promise.resolve().then(() => console.log('b'));
console.log('c');Run Code Online (Sandbox Code Playgroud)
此外,即使promises是同步的,调用docker.listContainers也是异步的,并在操作成功时接收回调函数.
如果您想等待承诺,请在承诺的then回调中放置您希望在承诺的回调中运行的代码:
// output 'a', 'b', 'c'
console.log('a');
Promise.resolve()
.then(() => console.log('b'))
.then(() => console.log('c'));Run Code Online (Sandbox Code Playgroud)
或者将代码包装在异步函数和await承诺中:
// output 'a', 'b', 'c'
(async () => {
console.log('a');
await Promise.resolve().then(() => console.log('b'))
console.log('c');
})()Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3701 次 |
| 最近记录: |