Node.JS - Promises不等待解决

时间:2017-08-06 22:41:09

标签: javascript node.js promise

我正在使用dockerode来操作来自node.js的docker。它自己的图书馆不是问题,但我有PROMISE的问题。似乎承诺不等待解决。

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

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

但我收到了:

Start
End
Middle

似乎承诺不等待继续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

1 个答案:

答案 0 :(得分:12)

你的输出是正确的,你误解了承诺是如何运作的。

承诺为asynchronous,它们在different (microtask) tick的同一任务中的event loop上运行。这意味着在同步代码运行时没有解决任何承诺。



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




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

如果您想等待承诺,请在承诺的then回调中解决您希望运行的代码:



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




或者将代码包装在async functionawait承诺中:



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