Javascript 那承诺是怎么实现的呢?
看了视频,读了[Promise.then][1]之后,我仍然不明白它是如何工作的。 因此,我编写了一个示例,并打印到控制台,但仍然带有输出,我无法理解它是如何工作的。 我希望我的问题足够清楚,如果不清楚,请告诉我,我会根据你的回答详细说明。 这是我的代码:Javascript 那承诺是怎么实现的呢?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,看了视频,读了[Promise.then][1]之后,我仍然不明白它是如何工作的。 因此,我编写了一个示例,并打印到控制台,但仍然带有输出,我无法理解它是如何工作的。 我希望我的问题足够清楚,如果不清楚,请告诉我,我会根据你的回答详细说明。 这是我的代码: const getCountryData=函数(国家){ 取回(`https://restcountries.eu/rest/v2/name/${country}`) 。然后(响应=>{ console.log('111111111'); 如
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()
的结果被传递到第二个然后
,依此类推
发生错误时,链条断开,直接进入firscatch
功能
在引擎盖下,考虑到在<代码>和函数中的提取和其他操作可以是异步的,所以运行时发生的是在事件队列中推取函数的结果,当事件循环取下一个函数时,从队列中提取并传递给函数。/>
本文解释了它的内部工作原理:我将尝试使用
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一个简单的答案是“是”