Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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_Node.js_Asynchronous_Promise_Reduce - Fatal编程技术网

Javascript 一系列承诺如何在不被消费/履行的情况下返回?

Javascript 一系列承诺如何在不被消费/履行的情况下返回?,javascript,node.js,asynchronous,promise,reduce,Javascript,Node.js,Asynchronous,Promise,Reduce,我对下面的代码是如何工作的感到困惑。 我希望after Promise.resolve()返回一个已解决的承诺,而不是挂起的承诺。然后()会立即使用它/实现它,这意味着; 在每个reduce回调调用中,都会问两个问题(承诺链)——但事实上,它们都是连锁的,只有从函数chainpromissions返回时,它们才会相互消耗并一起运行 这是因为我们正在等待“调用堆栈”为空,而每个.then()都在等待上一个.then()回调结束,以便返回一个承诺,等等。? 减少是如何起作用的 有人能帮助我更好地理解

我对下面的代码是如何工作的感到困惑。 我希望after Promise.resolve()返回一个已解决的承诺,而不是挂起的承诺。然后()会立即使用它/实现它,这意味着; 在每个reduce回调调用中,都会问两个问题(承诺链)——但事实上,它们都是连锁的,只有从函数chainpromissions返回时,它们才会相互消耗并一起运行

这是因为我们正在等待“调用堆栈”为空,而每个.then()都在等待上一个.then()回调结束,以便返回一个承诺,等等。? 减少是如何起作用的

有人能帮助我更好地理解代码及其背后的概念吗

var fs=require(“fs”);
var readline=需要(“readline”);
var rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout
});
让问题数据=[];
promisifyQuestion('您知道多少种语言?\n')
.然后((numf语言)=>{
退货承诺(NumofLanguagues)
})
。然后((数据)=>{
fs.writeFile(“./langs.json”,json.stringify(questionsData),()=>{})
返回promisifyQuestion(“显示语言”)
})
.然后(x=>{
log(JSON.stringify(questionsData.find(el=>el.name==x))
rl.close();
});
函数promisifyQuestion(msg){
返回新承诺((解决、拒绝)=>{
rl.问题(消息,解决)
});
}
功能链(长度){
对于(变量i=0;ipromisifyQuestion('语言名称:'))
.然后(x=>{
问题数据[currentIndex].name=x;
        
回报承诺问题(“说它的年份:”)
})
.然后(x=>{
返回问题数据[currentIndex]。年份=x
});

}
承诺等待JavaScript调用堆栈为空。下面的代码段打印出
1 2 3
,表示
。然后
回调不会立即运行。从技术上讲,它们被安排在微任务队列中,与事件循环分离

console.log('1');
Promise.resolve()然后(()=>console.log('3');

console.log('2')承诺等待JavaScript调用堆栈为空。下面的代码段打印出
1 2 3
,表示
。然后
回调不会立即运行。从技术上讲,它们被安排在微任务队列中,与事件循环分离

console.log('1');
Promise.resolve()然后(()=>console.log('3');
console.log('2')
Promise.resolve()
返回已履行的承诺,而不是挂起的承诺-
。然后()
将立即使用它

是的,没错

在每次reduce回拨电话中,将询问两个问题(承诺链)

不可以。只会立即调用链中的第一个
然后
回调。其他
then
调用不在初始
Promise.resolve()
值上,而是在先前返回的值上。而那些没有立即兑现的承诺,他们会用
解决并等待
回调返回的承诺

Promise.resolve()
返回已履行的承诺,而不是挂起的承诺-
。然后()
将立即使用它

是的,没错

在每次reduce回拨电话中,将询问两个问题(承诺链)


不可以。只会立即调用链中的第一个
然后
回调。其他
then
调用不在初始
Promise.resolve()
值上,而是在先前返回的值上。而那些没有立即履行的承诺,他们会用
解决并等待
回调返回的承诺。

一些术语:
resolved
表示“它在遵循另一个承诺”,如
promise.resolve(其他承诺)
-您考虑的是不同的已履行承诺。promise.resolved()返回的承诺不是一个值为“undefined”的已履行已解决承诺吗?我不明白为什么它不会立即触发.Then()链。是的,我只是在更正术语。reduce只是一个链接(循环)承诺的技巧——reduce构建了一个链。@BenjaminGruenbaum是的,我认为它在异步代码方面的工作原理与forEach类似。但是我似乎不知道它到底是如何与承诺一起工作的。你能包括示例输出以及它与你的期望有什么不同吗?一些术语:
resolved
表示“它正在遵循另一个承诺”,如
promise.resolve(someOtherPromise)
-您考虑的是不同的已履行承诺。promise.resolved()返回的承诺不是一个值为“undefined”的已履行已解决承诺吗?我不明白为什么它不会立即触发.Then()链。是的,我只是在更正术语。reduce只是一个链接(循环)承诺的技巧——reduce构建了一个链。@BenjaminGruenbaum是的,我认为它在异步代码方面的工作原理与forEach类似。但我似乎不知道它到底是如何与承诺一起工作的。你能把样本输出包括进来吗?它与你的期望有什么不同?太好了!这与我从调试上述代码中得出的结论非常吻合。我们将尝试通过链接文章更好地理解它。太好了!这与我从调试上述代码中得出的结论非常吻合。我们将尝试通过链接文章更好地理解它。如果我们结合Josh Lee的回复,基本上第一个.then()回调将发送到event-l