Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .然后()带着承诺订购_Javascript_Promise - Fatal编程技术网

Javascript .然后()带着承诺订购

Javascript .然后()带着承诺订购,javascript,promise,Javascript,Promise,为什么我的.then()chainprinter.done()没有显示我的消息 printer.done()应该显示一个消息模板 .then(() => { const whileHeapList = () => { setTimeout(() => { console.log(new Date()); console.log(1); setTimeout(() => {

为什么我的
.then()
chain
printer.done()
没有显示我的消息

printer.done()
应该显示一个消息模板

   .then(() => {
    const whileHeapList = () => {
        setTimeout(() => {
            console.log(new Date());
            console.log(1);
            setTimeout(() => {
                console.log(2);
                console.log(new Date());
            }, 5000)
        }, 5000);
    };
    whileHeapList();
    }).then(() => {
        printer.done()
    });
我希望我的代码执行的是日志1,等待5秒日志2,然后打印出
printer.done()
template消息

现在这是输出:

** TEMPLATE **

2017-01-30T04:19:54.111Z
1
2
2017-01-30T04:19:59.118Z

如果希望第二个
。然后
等待第二个
设置超时
完成,则需要从第一个
返回一个承诺。然后
在第二个
设置超时
触发后解析

.then(function () {
    var whileHeapList = function whileHeapList() {
        return new Promise(function(resolve) { // added
            setTimeout(function () {
                console.log(new Date());
                console.log(1);
                setTimeout(function () {
                    console.log(2);
                    console.log(new Date());
                    resolve(); // added
                }, 5000);
            }, 5000);
        }); // added
    };
    return whileHeapList(); // added a return
}).then(function () {
    printer.done();
});
或者,在您的注释中使用尝试的代码

.then(function () {
    var whileHeapList = function whileHeapList(resolve) {
        setTimeout(function () {
            console.log(new Date());
            console.log(1);
            setTimeout(function () {
                console.log(2);
                console.log(new Date());
                resolve(); // added
            }, 5000);
        }, 5000);
    };
    return new Promise(whileHeapList);
}).then(function () {
    printer.done();
});

我会做一个睡眠功能,然后与之链接

const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

...    

.then(() => sleep(5000))
.then(() => console.log(1, new Date()))
.then(() => sleep(5000))
.then(() => console.log(2, new Date()))
.then(() => printer.done())

顶部的代码
。然后,
不会返回等待的承诺,因此,
printer.done
将几乎执行immediately@JaromandaX如果我有
返回新承诺(whilehaplist)
而不是
whilehaplist()
我得到了1,2和时间日志,但模板没有显示。我尝试了这个方法,但先打印模板,然后打印其余的。我试图先打印1,2
和Date()
,然后打印模板。不确定发生这种情况的原因=/。我认为最后一个
.then()
只有在
完成之前才执行。then()
此代码将记录1、2,然后才会
打印机。done()
执行。。。请确保您没有获取代码中的每个返回值-问题可能存在,因为您发布的代码与您实际使用的代码大不相同-因为代码中的嵌套超时没有任何有用的用途。。。如果需要,则要“等待”前面的
中的一些异步代码。然后
必须返回一个在异步完成时解析的承诺