Javascript 那承诺是怎么实现的呢?

Javascript 那承诺是怎么实现的呢?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,看了视频,读了[Promise.then][1]之后,我仍然不明白它是如何工作的。 因此,我编写了一个示例,并打印到控制台,但仍然带有输出,我无法理解它是如何工作的。 我希望我的问题足够清楚,如果不清楚,请告诉我,我会根据你的回答详细说明。 这是我的代码: const getCountryData=函数(国家){ 取回(`https://restcountries.eu/rest/v2/name/${country}`) 。然后(响应=>{ console.log('111111111'); 如

看了视频,读了[Promise.then][1]之后,我仍然不明白它是如何工作的。 因此,我编写了一个示例,并打印到控制台,但仍然带有输出,我无法理解它是如何工作的。 我希望我的问题足够清楚,如果不清楚,请告诉我,我会根据你的回答详细说明。 这是我的代码:

const getCountryData=函数(国家){
取回(`https://restcountries.eu/rest/v2/name/${country}`)
。然后(响应=>{
console.log('111111111');
如果(!response.ok)
抛出新错误(`Country not found(${response.status})`);
返回response.json();
})
。然后(数据=>{
console.log('22222');
常量邻居=数据[0]。边界[0];
如果(!邻居)返回;
回传(`https://restcountries.eu/rest/v2/alpha/${neighbor}`);
})
。然后(响应=>{
console.log('333')
如果(!response.ok)
抛出新错误(`Country not found(${response.status})`);
返回response.json();
})
.then(data=>console.log('444'))
.catch(错误=>{

error(`${err}then
函数不接收回调,它们接收上一个异步操作的结果。 因此,
fetch
的结果被传递到第一个
然后
,而
response.json()
的结果被传递到第二个
然后
,依此类推

发生错误时,链条断开,直接进入firs
catch
功能

在引擎盖下,考虑到在<代码>和函数中的提取和其他操作可以是异步的,所以运行时发生的是在事件队列中推取函数的结果,当事件循环取下一个函数时,从队列中提取并传递给函数。/>


本文解释了它的内部工作原理:

我将尝试使用
async/await
操作符以不同的方式解释这一点

您的
getCountryData
函数的等效项如下

const getCountryData=async(国家)=>{
log(“在所有异步调用之后”);//下面这一行的解释
试一试{
让response1=等待获取(`https://restcountries.eu/rest/v2/name/${country}`);
//首先
console.log('111111111');
如果(!response1.ok)
抛出新错误(`Country not found(${response1.status})`);
让data1=wait response1.json();
//其次
console.log('22222');
常量邻居=数据1[0]。边界[0];
让我们回应2;
如果(邻居)
response2=等待获取(`https://restcountries.eu/rest/v2/alpha/${neighbor}`);
//第三
console.log('333333');
如果(!response2.ok)
抛出新错误(`Country not found(${response2.status})`);
让data2=wait response2.json();
//第四
console.log('444');
}捕捉(错误){

console.error(`${err}“那么哪个对象调用第二个?”-没有“对象”调用它。您的代码正在调用一个对象上的方法-并且在您的代码中,这是第一个
.then()
调用返回的承诺。“从回调返回的那个?”-当第二个
.then()调用时,回调尚未执行调用了
,所以它不可能是返回值。请看一下,我读了两个链接,仍然无法理解一些内容。1.当
方法立即执行时,是否所有的
,而不必等待回调首先运行?2.如何将一个回调返回值作为第二个回调输入(不完全是因为它从“承诺”中提取了值。)它是承诺被实现的值,通常是传递给承诺的
resolve()
函数的值。这取决于承诺的构造方式。如果它是由
构造的承诺(从
返回),那么(res=>…)
call,是的,它是通过回调的返回值来解决的。但是,如果你从
回调中返回一个承诺,那么
回调的外部承诺最终将与内部承诺的结果一起实现。我认为这并不能回答问题。OP从未考虑将
数据
响应
作为回调函数s、 为什么不呢?不是那样工作的?我认为这个答案有点误导。
然后
会注册回调,当
承诺
解决时,底层调度程序会调用回调。响应不会传递给
然后
,而是传递给注册的调度程序callback@sinanspd是的,好的,我试着简化。在实践中发生的情况是,第一个
然后
的输出被传递到第二个
然后
@ema是的,它不是那样工作的,但是OP也从来没有假设过,所以你的答案不需要指出
然后
函数不接收回调。谢谢,但我不理解回调返回的是什么。如果行`让data1=wait response1.json();`返回一个
Promise
对象,因此行
const neighbor=data1[0]。边框[0]
工作?
数据
变量来自
承诺
类型,而
承诺
没有
数据
属性解释
然后
异步
/
等待
而言,等待
是把事情弄混了,因为
等待
会回到
然后
调用。“对于第二个then回调,不可能从第一个then直接访问参数”-除非您(这正是
wait
内部所做的事情)执行
fetch().then().then().catch()
fetch().catch().then().then()
,它们的工作原理是一样的-不,绝对不是。@Eitanos30一个简单的答案是“是”