在javascript wrt不同的函数调用语法中,promisified控制流是如何导航的
我有在javascript wrt不同的函数调用语法中,promisified控制流是如何导航的,javascript,promise,Javascript,Promise,我有doSomething,doSomethingElse和finalHandler功能如下: function doSomething() { console.log('doSomething(): start'); return new Promise(function (resolve) { setTimeout(function () { console.log('doSomething(): end'); resolve(); }, 10
doSomething
,doSomethingElse
和finalHandler
功能如下:
function doSomething() {
console.log('doSomething(): start');
return new Promise(function (resolve) {
setTimeout(function () {
console.log('doSomething(): end');
resolve();
}, 1000);
});
}
function doSomethingElse() {
console.log('doSomethingElse(): start');
return new Promise(function (resolve) {
setTimeout(function () {
console.log('doSomethingElse(): end');
resolve();
}, 1000);
});
}
function finalHandler() {
console.log('finalHandler(): start');
return new Promise(function (resolve) {
setTimeout(function () {
console.log('finalHandler(): end');
resolve();
}, 1000);
});
}
我有一个函数example1
,如下所示:
function example1() {
doSomething().then(function () {
return doSomethingElse();
}).then(finalHandler);
}
他回来了
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
我有示例2
:
function example2() {
doSomething().then(function () {
doSomethingElse();
}).then(finalHandler);
}
返回:
doSomething(): start
doSomething(): end
doSomethingElse(): start
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomethingElse(): start
doSomething(): end
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
和示例3
:
function example3() {
doSomething().then(doSomethingElse())
.then(finalHandler);
}
返回:
doSomething(): start
doSomething(): end
doSomethingElse(): start
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomethingElse(): start
doSomething(): end
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
和示例4
:
function example4() {
doSomething().then(doSomethingElse)
.then(finalHandler);
}
返回:
doSomething(): start
doSomething(): end
doSomethingElse(): start
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomethingElse(): start
doSomething(): end
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
我可以理解,不同的函数调用语法会产生不同的结果——但这种行为背后的概念是什么
我不是在寻找一个修正或优化的代码。我想知道如何使用不同的语法导航流?这里的概念-
.then(function () {
return doSomethingElse();
})
现在执行。
与上述流程相同-
log('doSomethingElse():start');-->1秒后doSomethingElse结束
最后一次也是这样:
console.log('finalHandler():start');-->在1sec console.log('finalHandler():end')之后
示例2与示例1的不同之处在于,在第一个示例中,doSomethingElse会返回一个承诺。然后在那之后链接的将在执行之前等待该承诺得到解决
doSomethingElse返回一个承诺,我们不会在then处理程序回调中返回该承诺,这就是为什么将执行事件,并且将为doSomethingElse()设置setTimeout():结束,将立即执行then for final处理程序,因为它不会等待前一个承诺得到解决。
只有在前一个国家重新做出承诺的情况下,它才会等待。因此,首先打印finalHandler():start。在此之后,doSomethingElse超时和finalHandler超时的计时器都将过期,但之前的
超时将是任务队列中的第一个,因此它将首先被打印
关于不同的格式。。
当您执行.then(doSomethingElse)时,您将传递一个对函数的引用,因此这与您在then.then()中复制doSomethingElse的完整代码相同。这是一个有效的回调。但是当您执行.then(doSomethingElse())时,它只执行函数doSomethingElse,但它不是回调,因此没有得到任何回调,它只是得到未定义,因此执行下一个then in链
剩下的两个例子现在应该是不言自明的。“一个人只会期望以下输出”-呃,不,你为什么会期望这样?你知道<代码>是怎么回事吗?你能解释一下我对这个答案很不信服吗