JavaScript承诺如何执行其代码?

JavaScript承诺如何执行其代码?,javascript,callback,promise,Javascript,Callback,Promise,这是我偷来的一些代码,稍加修改 var momIsHappy=false; var getAPhone=函数(WhatToDoiPhoneisPurchased, Whattodoofphones(未购买){ fulfillPromiseToPurchasePhone=购买了什么样的手机; breakPromiseToPurchasePhone=未购买的手机; 如果(momIsHappy){ var电话={ 品牌:“三星”, 颜色:“黑色” }; 完成PromiseToPurchasePhone

这是我偷来的一些代码,稍加修改

var momIsHappy=false;
var getAPhone=函数(WhatToDoiPhoneisPurchased,
Whattodoofphones(未购买){
fulfillPromiseToPurchasePhone=购买了什么样的手机;
breakPromiseToPurchasePhone=未购买的手机;
如果(momIsHappy){
var电话={
品牌:“三星”,
颜色:“黑色”
};
完成PromiseToPurchasePhone(电话);//完成
}否则{
var reason=新错误(“妈妈不高兴”);
违反承诺购买手机(原因);//拒绝
}
}
var aPhoneIMightGet=新承诺(getAPhone);
var playWithNewPhone=函数(){
findOutIfIGetPhone=aPhoneIMightGet;
findOutIfIGetPhone
.然后(功能(电话){
//耶,你有一部新手机
控制台日志(aPhone);
//输出:{品牌:'三星',颜色:'黑色'}
})
.catch(函数(错误){
//哎呀,妈妈不信
console.log(错误消息);
//输出:“妈妈不高兴”
});
};

我不明白的是:什么时候调用
getAPhone
?我没叫它。谁说的?什么时候如何做?

用一个简单的例子来测试这一点并不难:

函数someFun(){
控制台日志(“测试”)
}
让p=新的承诺(一些乐趣)
我不明白的是:什么时候叫“getAPhone”?我没有打电话 信息技术谁说的?什么时候怎么做

也许更直接地回答这个问题:当您将新承诺分配给变量“aPhoneIMightGet”时,构造函数将按照上面Mark Meyer所述的方式运行

您的“getAPhone”是传递到Promise构造函数中的“executer函数”。因此,它会在承诺构造函数返回之前立即执行。这就是所谓的“getAPhone”函数


您可以找到一篇可能有帮助的好文章。

让我们备份一下,描述一下Promise构造函数的功能。承诺构造函数被传递一个同步调用的回调。此回调(通常称为“Promise executor回调”)背后的思想是,它将启动一些异步操作,然后立即返回。一段时间后,当异步操作完成时,它将解析或拒绝该承诺

下面是一个简单的示例,我们可以一步一步地介绍(您可以在下面的代码段中运行此示例以查看日志记录序列):

console.log(“0”);
设p=新承诺(函数(解析、拒绝){
控制台日志(“1”);
setTimeout(函数(){
控制台日志(“2”);
决定(“完成”);
}, 1000);
}).then(功能(val){
控制台日志(“3”);
});

控制台日志(“4”)
Promise构造函数接受一个函数作为参数,并且该函数在创建Promise时立即运行。那么为什么代码不在Promise的构造函数中阻塞呢?它不是调用堆栈上的一个函数吗?您确实在
findOutIfIGetPhone处调用了它。然后(…)
那么,为什么promise构造函数在运行我的函数时不阻止我的代码呢?如果构造函数所做的只是立即为我调用一个函数,为什么它与直接调用函数不同?它不会阻塞,因为“setTimeout”不会阻塞。它使用resolve注册计时器作为回调,并继续函数的其余部分。那么,为什么promise构造函数在运行我的函数时不阻塞我的代码呢?如果构造函数所做的一切都是立即为我调用一个函数,那么它与直接调用函数有什么不同呢?承诺是异步的、非阻塞的。他们在通话后立即返回,尽管承诺可能尚未得到解决。如果直接调用函数,它将“阻塞”,因为它是在javascript的单个执行线程中执行的。这就是承诺背后的想法。。。它们不允许在调用时阻塞,而是允许一个可能很长的过程——计算、数据库查询等——在执行过程中不阻塞。一旦获得结果,承诺将通过执行resolve或error函数返回