我正在重构别人的代码。
let promiseObj = Application.models.Widget.findById(connection.childId)
if (connection.child != 'Widget') {
typeES = "media"
promiseObj = Application.models.Media.findById(connection.childId)
}
promiseObj.then((obj) => {
let ownerId = obj.ownerId
let promiseUser = Application.models.MyUser.findById(ownerId)
})
问题是,服务器何时被调用 "让promiseObj = Application.models.Widget.findById(connection.childId)"宣布。
或者,当.then被声明为承诺有办法实现时,服务器会被调用。
这是ES6的环回。
谢谢你们/女孩:D
答案 0 :(得分:2)
声明
let promiseObj = Application.models.Widget.findById(connection.childId)
时是否调用服务器。
是的,一旦调用findById
方法,就会发出服务器请求。
或者,当.then被声明为承诺有办法实现时,服务器会被调用。
then
只是一个名为的方法,此处没有声明。而且它并没有给予承诺一种实现的方式" - 承诺将在请求完成后始终解决(成功时执行并在发生错误时拒绝),无论是否有任何回调。
如果您通过then
安装回调,则会在履行承诺时调用它。
所以是的,我很确定你应该重构这段代码:
let promiseObj;
if (connection.child != 'Widget') {
promiseObj = Application.models.Widget.findById(connection.childId);
} else {
typeES = "media"
promiseObj = Application.models.Media.findById(connection.childId)
}
let promiseUser = promiseObj.then((obj) => {
return Application.models.MyUser.findById(obj.ownerId);
});
答案 1 :(得分:0)
正如Erazihel所解释的那样,声明并没有解决问题,而是在你打电话时调用.then()
我做了一个简单的例子,为了可视化效果,你将检查解析的时间是否与调用.then()的时间相匹配,而不是声明。
p1.then(
// Then calls the resolve so the execution time 'resolve' matches .then
function(val) {
var timeMeAgain = new Date().toLocaleString();
log.insertAdjacentHTML('beforeend', val.thisPromiseCount +
') Promise done, then is called here (<small>Async call finished, .then called at: '+timeMeAgain+', promise executed at": '+val.timeCalledAt+' </small>)<br/>');
})
*代码基于MDN示例。查看文档here
修改强>
关于resolve方法,正如MDN文档所述:
该方法返回一个使用给定值解析的Promise对象。 如果值是一个值(即具有“then”方法),则返回 承诺将“遵循”那种可靠的,采用其最终状态; 否则返回的承诺将用值来实现。
意味着当数据库或端点返回信息时,将返回响应对象,不是声明的声明。